C++ 为什么boost::mutex使用原子操作和事件而不是关键部分

C++ 为什么boost::mutex使用原子操作和事件而不是关键部分,c++,boost,boost-thread,C++,Boost,Boost Thread,根据最新版本的boost::mutex的回答,它使用原子操作和Win32事件来阻止等待,而不是关键部分。为什么?这背后的原因是什么?我相信这就是你想要的(来源): 实现互斥的最简单方法是编写包装器 为一个本机Windows同步对象初始化;之后 好吧,这就是他们来的目的。不幸的是,他们都有自己的缺点 问题。互斥体、事件和信号量都是内核对象,因此 同步调用需要到内核的上下文切换。这个可以 价格相当昂贵,尤其是在没有竞争的情况下 Boost互斥锁仅设计用于单个进程,因此 关键部分看起来很吸引人。不幸的

根据最新版本的
boost::mutex
的回答,它使用原子操作和Win32事件来阻止等待,而不是关键部分。为什么?这背后的原因是什么?

我相信这就是你想要的(来源):

实现互斥的最简单方法是编写包装器 为一个本机Windows同步对象初始化;之后 好吧,这就是他们来的目的。不幸的是,他们都有自己的缺点 问题。互斥体、事件和信号量都是内核对象,因此 同步调用需要到内核的上下文切换。这个可以 价格相当昂贵,尤其是在没有竞争的情况下

Boost互斥锁仅设计用于单个进程,因此 关键部分看起来很吸引人。不幸的是,有 这也有问题。首先,它需要 显式初始化,这意味着它不能可靠地用作 具有静态存储持续时间的对象的一部分-标准 静态初始化顺序问题因 竞争条件,特别是当互斥被用作本地静态时。在…上 大多数编译器使用静态存储动态初始化对象 持续时间不是线程安全的,因此两个线程可能会竞相运行 初始化,可能导致正在运行初始化 两次,或者一个线程在不等待初始化的情况下继续 正在由另一个线程运行以完成。第二个问题是 你不能在一个关键的部分进行定时等待,这意味着我们需要 另一个支持定时等待的互斥锁解决方案

将关键_部分用作 高性能互斥锁,即线程解锁 关键_部分将把所有权移交给等待的线程


我想是为了增强可移植性?@David Haim Win32 Events在您看来没有关键部分那么特定于平台?我想他们更喜欢平台事件+独立的原子操作,而不是完全的平台实现。我怀疑您会在这里得到更好的答案,问开发人员是谁在一些与boost相关的应用程序上做的它们悬挂的地方。这个问题仍然很有趣,因为除非boost用于ring0代码中,否则将关键会话替换为事件似乎不太合理。@Frozenhart没有人说事件与平台无关。David说“增强可移植性”(图书馆的)。该库希望在所有操作系统上保证相似的语义。这可能是一个因素。不是我说“可能”,因为我不知道。因此,“增强可移植性”是关于
boost::mutex
的行为,而不是关于代码是否可以在平台上编译。