开发人员遇到多线程的常见缺陷是什么?

时间:2009-06-02 01:48:09

标签: multithreading

  

可能重复:
  What are common concurrency pitfalls?

我有线程的基本知识,没有具体的。我和一些同事正在学习认证,我们正在讨论多线程。

在实现多线程应用程序时,您遇到了哪些常见错误?

在开发多线程应用程序时,我们应该注意哪些“陷阱”?

4 个答案:

答案 0 :(得分:1)

多线程应用程序的典型难点是两个不同的线程同时修改同一个内存。解决此问题的方法称为同步。

See my more complete answer here

答案 1 :(得分:1)

答案 2 :(得分:0)

最大的问题是

  • 从不同线程更新数据(并发写入);甚至像i ++这样简单的东西也不总是原子的,换句话说,如果两个线程同时执行它,结果可能是i + = 2,或者它可能是i ++(或者它可能是任何东西,取决于你的语言'重新使用);答案是确保写入访问在“互斥”(互斥)锁上“同步”,以便最多一个线程可以在给定时间写入该易失性数据块

  • 死锁,其中一个线程必须获取A上的互斥锁,然后获取B上的互斥锁,另一个线程以相反的顺序获取互斥锁;如果第一个线程获得A,第二个线程获得B,则两个线程都不能继续;这里的答案是确保以规范顺序获取互斥锁

但最好的建议是KISS,保持简单愚蠢。复杂的线程模型非常难以调试。如果可能的话,没有多个线程进行写操作,特别是尽量避免多个嵌套的互斥锁(需要A和B都做某事)。

另一条建议是使用众所周知的线程安全数据类型库,例如原子对象和并发映射和队列。

考虑到未来(云计算),您可能会考虑编写应用程序,就像线程在不同的计算机上一样,尽可能少地进行交叉通信。

答案 3 :(得分:0)

我认为最大的问题是忘记多个区域是否可以启动线程,因为您可能有竞争条件,因为一个部分可能会同步,但如果有另一个入口点,您将遇到难以追踪的问题。

但是,最困难的部分是知道何时使用多线程。对于每种情况都不是完美的。

应传递哪些参数,以及您可以使用的全局变量很少。

我认为有很多好的想法来自函数式编程,以限制副作用,因为你开始了解到很多全局变量可能很糟糕,如果它们可以被许多不同的线程改变的话。

当您有多个线程时进行调试也将是一个挑战,具体取决于您使用的语言,例如,在unix上使用C调试器并不好玩,但Visual Studio使其更容易。