C++ Boost是否支持Windows EnterCriticalSection API?
我知道Boost支持互斥锁和锁护,可以用来实现关键部分 但是Windows有一个用于关键部分的特殊API(请参阅和),它比互斥锁(用于很少争用的短代码部分)快得多C++ Boost是否支持Windows EnterCriticalSection API?,c++,windows,boost,critical-section,C++,Windows,Boost,Critical Section,我知道Boost支持互斥锁和锁护,可以用来实现关键部分 但是Windows有一个用于关键部分的特殊API(请参阅和),它比互斥锁(用于很少争用的短代码部分)快得多 因此,我的问题是——在Boost中,有可能利用这个API,并在其他平台上回退到基于spinlock/mutex/futex的实现吗?简单的答案是否定的 以下是一些相关背景 顺便说一句,我同意互斥是一种更通用的解决方案 从性能的角度来看。但公平地说,简单来说,CS更快 设计。我认为,支持他们的可能性应该是最大的 最少 考虑到 这就是有人
因此,我的问题是——在Boost中,有可能利用这个API,并在其他平台上回退到基于spinlock/mutex/futex的实现吗?简单的答案是否定的 以下是一些相关背景 顺便说一句,我同意互斥是一种更通用的解决方案 从性能的角度来看。但公平地说,简单来说,CS更快 设计。我认为,支持他们的可能性应该是最大的 最少 考虑到 这就是有人指给我看的那篇文章。结论是 只有在以下情况下,CS才会更快:
- 进程中总共少于8个线程
- 你不是在后台跑步
- 你不是在双处理器机器上
- 使用PIMPL可以获得构造和破坏命中 或者您必须在Boost.Threads标题中包含Windows.h, 这是我根本不想做的。(这可以通过以下方式解决: 从MSDN模拟CS ala OPTEX。)
- 根据这篇研究论文,大多数项目不会从中受益 一个CS设计
- 编写一个(不可移植的)关键的_节类是很简单的 如果你真的能利用它,就遵循互斥模型
作为一个帮助维护Boost.Thread的人,以及一个未能将事件对象添加到Boost.Thread中的人,我认为关键部分从未添加过,也不会添加到Boost中,原因如下:
因此,看起来默认的Boost互斥体不支持它,但是
asio::detail::mutex
支持它
所以我最后用了这个:
#include <boost/asio/detail/mutex.hpp>
#include <boost/thread.hpp>
using boost::asio::detail::mutex;
using boost::lock_guard;
int myFunc()
{
static mutex mtx;
lock_guard<mutex> lock(mtx);
. . .
}
#包括
#包括
使用boost::asio::detail::mutex;
使用boost::lock_-guard;
int myFunc()
{
静态互斥;
锁和防护锁(mtx);
. . .
}
Mmm。有人指出它可能使用互斥,而不是CriticalSection。在我得出结论之前,让我再看一看,在Windows中,关键部分不是互斥。它是一个用户模式的对象,而互斥是一个内核模式的对象。显然,这个实现细节在Boost线程的历史中已经发生了变化。我只能假设这是有充分理由的。我建议你自己写一个基本的时钟模型——一个可能在地球上浮动webs@rustyx我知道这一点。我想强调的是,尽管boost::mutex
被命名为“mutex”,但这并不一定意味着实现使用了同名的Win32原语。(尽管,所有这些现在还没有定论)更新了我的答案,使之更具相关性