gpt4 book ai didi

multithreading - 无锁同步

转载 作者:行者123 更新时间:2023-12-04 14:49:31 24 4
gpt4 key购买 nike

我的问题与多线程无锁同步有关。我想知道以下内容:

  • 实现这一目标的一般方法是什么?我在某处阅读了有关 LockFreePrimitives 的内容,例如 CompareAndExchange (CAS) 或 DoubleCompareAndExchange (DCA),但没有给出任何解释?任何减少使用锁的方法?
  • Java/.NET 如何实现它们的并发容器?他们使用锁还是无锁同步?

  • 提前致谢。

    最佳答案

    以下是一些可以最大限度减少锁使用的通用方法,假设您的算法具有一些特定的可利用功能:

  • 更新单个数值变量时,您可以使用非阻塞原语,例如 CAS、atomic_increment 等。它们通常比经典的阻塞临界区(锁、互斥锁)快得多。
  • 当一个数据结构被多个线程读取,但只被一个或几个线程写入时,一个明显的解决方案是读写锁,而不是全锁。
  • 尝试利用细粒度锁定。例如,与其使用单个锁锁定整个数据结构,不如查看是否可以使用多个不同的锁来保护数据结构的不同部分。
  • 如果您依靠锁的隐式内存栅栏效应来确保跨线程的单个变量的可见性,只需使用 volatile 1,如果有。
  • 有时,在实践中使用条件变量(和关联的锁)太慢了。在这种情况下,一个 volatile忙碌的旋转更有效率。

  • 更多关于这个话题的好建议: http://software.intel.com/en-us/articles/intel-guide-for-developing-multithreaded-applications/

    在另一个 SO 问题中读得很好: Lock-free multi-threading is for real threading experts (不要被标题吓到)。

    以及最近讨论的 atomic_decrement 的无锁 Java 实现: Starvation in non-blocking approaches

    1 volatile的使用这里适用于 Java 等语言,其中 volatile在内存模型中定义了语义,但没有定义到 C 或 C++,其中 volatile在引入跨线程内存模型之前并没有与之集成。这些语言中也有类似的结构,例如各种 std::memory_order C++ 中的说明符。

    关于multithreading - 无锁同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9103758/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com