我有以下情况:
两个C++11线程正在进行计算,它们通过std::mutex进行同步。
线程A锁定互斥对象,直到数据准备就绪,然后执行线程B。当互斥锁解除时,线程B开始工作。
线程B试图锁定互斥锁并被阻塞,直到线程A解锁为止。
void ThreadA (std::mutex* mtx, char* data)
{
mtx->lock();
//do something useful with data
mtx->unlock();
}
void ThreadB (std::mutex* mtx, char* data)
{
mtx->lock(); //wait until Thread A is ready
//do something useful with data
//.....
}
声明线程A可以先阻止互斥体。
现在我想知道线程B中的mtx->lock()
是等待主动的还是被动的。线程B也是如此,轮询互斥锁状态和浪费处理器时间,或者在互斥锁解除时由脱落程序被动释放。
在不同的C++引用中,只提到线程被阻塞,而不是以哪种方式阻塞。
然而,std::mutex
的实现很难依赖于使用的平台和操作系统吗?
发布于 2015-10-05 14:22:06
它是高度定义的实现,即使对于同一个编译器和操作系统也是如此。
例如,在VC++上,在Visual 2010中,std::mutex
是用Win32 CRITICAL_SECTION
实现的。EnterCriticalSection(CRITICAL_SECTION*)
有一些很好的特性:首先,它试图通过一次又一次地在锁上迭代来锁定CRITICAL_SECTION
。在指定的迭代次数之后,它进行内核调用,使线程进入休眠状态,但在释放锁和重新启动整个事务时,会再次唤醒线程。在这种情况下,该机制在进入睡眠前一次又一次轮询锁,然后控件切换到内核。
Visual 2012提供了不同的实现。std::mutex
是用Win32互斥实现的。Win32互斥锁将控件立即转移到内核。锁没有活动的轮询。
您可以在答案:SECTION中阅读有关实现开关的信息。
因此,没有指定互斥锁是如何获得锁的。最好不要依赖这种行为。
ps。不要手动锁定互斥锁,而是使用std::lock_guard
。此外,您可能希望使用condition_variable
来更精确地控制同步。
https://stackoverflow.com/questions/32950616
复制相似问题