Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.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++ Windows的Boost互斥实现_C++_Windows_Multithreading_Boost - Fatal编程技术网

C++ Windows的Boost互斥实现

C++ Windows的Boost互斥实现,c++,windows,multithreading,boost,C++,Windows,Multithreading,Boost,据我所知,在旧版本的BoostBoost::mutex中,Windows的实现是使用关键部分完成的。但是在Boost1.51的最新版本中,我发现现在互斥实现是基于事件的 有人知道这一变化背后的理性吗?是因为性能原因吗?关键部分会被弃用吗?通过使用boost我们总是有最好的方法而不做任何更改,这不是很好吗? 在新版本的boost中,boost::mutex作为自旋锁实现,但借助windows事件避免繁忙等待,并且仅在需要时才会创建该事件,因此,它重量非常轻,具有非常高的性能,并且还允许boost使

据我所知,在旧版本的Boost
Boost::mutex
中,Windows的实现是使用关键部分完成的。但是在Boost1.51的最新版本中,我发现现在互斥实现是基于事件的


有人知道这一变化背后的理性吗?是因为性能原因吗?关键部分会被弃用吗?

通过使用
boost
我们总是有最好的方法而不做任何更改,这不是很好吗?
在新版本的
boost
中,
boost::mutex
作为自旋锁实现,但借助windows事件避免繁忙等待,并且仅在需要时才会创建该事件,因此,它重量非常轻,具有非常高的性能,并且还允许
boost
使用此重量很轻的
mutex
进行定时等待!我认为这很好

你看了boosts变更日志了吗?据我所知,这是为了简化和统一各种互斥体的设计:目前的
互斥体
定时互斥体
尝试互斥体
——都是使用
细节::基本定时互斥体
实现的,而这些互斥体不能使用CS。(实际上,使用CS并不总是最佳选择,它取决于并发场景,因此不值得为此而使设计复杂化。)您确实意识到,只有boost的设计者才能完全回答这个问题。我们其他人只能猜测…@Benj谁告诉我们这里需要一个真正的旋转锁?boost的许多部分依赖于使用原子变量实现的自旋锁,例如,看看
boost::shared_ptr
boost::detail::spinlock
的实现,并编写一个小程序,将该spinlock实现的性能与在windows甚至*nix系统上实现的最快锁进行比较,您会发现结果非常好!您几乎是正确的,但实际上
boost::mutex
根本不使用旋转锁!它使用原子操作作为优化:在获取锁时,它将首先(原子地)检查一个变量,该变量告知互斥锁当前是否已锁定。如果没有锁定,那么它可以继续(不必考虑Win32事件),这就是快速路径。如果检查显示互斥锁已锁定,那么(更)昂贵的win32功能将发挥作用。但这里根本没有旋转锁;-)