Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在关键部分、互斥锁和自旋锁之间进行选择_C++_Multithreading - Fatal编程技术网

C++ 在关键部分、互斥锁和自旋锁之间进行选择

C++ 在关键部分、互斥锁和自旋锁之间进行选择,c++,multithreading,C++,Multithreading,在选择关键部分、互斥锁和自旋锁时,需要记住哪些因素?所有这些都提供了同步功能,但是对于何时使用什么,是否有具体的指导方针 编辑:我指的是windows平台,因为它将关键部分视为同步结构。用windows的说法,关键部分是旋转锁和非忙等待的混合体。它旋转一小段时间,然后——如果它还没有抓住资源——它设置一个事件并等待它。如果资源争用率较低,则自旋锁行为通常就足够了 对于不需要担心与其他进程共享资源的多线程程序来说,关键部分是一个不错的选择 互斥锁是一种很好的通用锁。命名互斥体可用于控制多个进程之间

在选择关键部分、互斥锁和自旋锁时,需要记住哪些因素?所有这些都提供了同步功能,但是对于何时使用什么,是否有具体的指导方针


编辑:我指的是windows平台,因为它将关键部分视为同步结构。

用windows的说法,关键部分是旋转锁和非忙等待的混合体。它旋转一小段时间,然后——如果它还没有抓住资源——它设置一个事件并等待它。如果资源争用率较低,则自旋锁行为通常就足够了

对于不需要担心与其他进程共享资源的多线程程序来说,关键部分是一个不错的选择

互斥锁是一种很好的通用锁。命名互斥体可用于控制多个进程之间的访问。但是,使用互斥锁通常比使用关键部分要贵一点。

Windows中的互斥锁实际上是一种进程间并发机制,当用于进程内线程时,速度非常慢。A是Windows与您通常想到的互斥锁的类似物

当被争用的资源通常没有被持有相当数量的周期时,最好使用旋转锁,这意味着拥有锁的线程可能很快就会放弃它


编辑:我的答案只有在你的意思是“在Windows上”的情况下才相关,所以希望这就是你的意思。

需要考虑的一般要点:

  • 使用该机制的性能成本
  • 使用该机制引入的复杂性
  • 在任何给定的情况下,1或2可能更重要

    例如

    如果您使用多线程通过使用多个内核来编写高性能算法,并且需要保护一些数据以实现安全访问,那么1可能非常重要

    如果您有一个应用程序,其中后台线程用于轮询计时器上的某些信息,并且在极少数情况下它会注意到更新,您需要保护一些数据以供访问,那么2可能比1更重要

    1将取决于底层实现,并可能随保护范围而扩展,例如,进程内部的锁通常比机器上所有进程的锁都快

    2很容易判断错误。首次尝试使用锁来编写线程安全代码通常会错过一些导致死锁的情况。例如,如果线程A正在等待线程B持有的锁,而线程B正在等待线程A持有的锁,就会发生一个简单的死锁。意外实现起来非常容易

    在任何给定平台上,锁定机构的名称和质量可能会有所不同


    在windows上,关键部分速度快且特定于进程,互斥锁速度慢但跨进程。信号量提供了更复杂的用例。使用原子函数而不是锁可以非常有效地解决一些问题,例如从池中分配,例如在windows InterlocatedIncrement上,这确实非常快。

    可能重复,但可能不是OP想要的。不,我不希望在选择同步构造时记住这些差异,而是要记住一些要点。