【问题标题】:What are some common pitfalls developers run into with multi-threading? [duplicate]开发人员在使用多线程时会遇到哪些常见的陷阱? [复制]
【发布时间】:2009-06-02 10:27:13
【问题描述】:

可能重复:
What are common concurrency pitfalls?

我有线程的基本知识,没有什么特别的。我和一些同事正在学习认证,我们正在讨论关于多线程的章节。

在实现多线程应用程序时,您会犯哪些常见错误?

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

【问题讨论】:

标签: multithreading


【解决方案1】:

多线程应用程序的典型困难是两个不同的线程同时修改同一个内存。解决这个问题的方法叫做同步。

See my more complete answer here.

【讨论】:

    【解决方案2】:
    【解决方案3】:

    最大的问题是

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

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

    但最好的建议是亲吻,保持简单愚蠢。复杂的线程模型调试起来非常痛苦。如果可能的话,不要有多个线程进行写入,尤其是尽量避免多个嵌套的互斥锁(需要 A 和 B 来做某事)。

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

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

    【讨论】:

      【解决方案4】:

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

      但是,最难的部分是知道何时使用多线程。它并不适合所有情况。

      应该传入哪些参数,以及你可以避免多少全局变量。

      我认为函数式编程有很多好的想法可以限制副作用,因为您开始了解到,如果全局变量可以通过许多不同的线程进行更改,它们可能会很糟糕。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-19
        • 2012-06-30
        • 1970-01-01
        • 2010-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-11
        相关资源
        最近更新 更多