导致C ++ 11 std :: mutex将阻塞的线程锁定为被动等待状态?

托比亚斯关

我有以下情况:

两个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可以先阻止互斥量。

现在我想知道mtx->lock()线程B中的等待是主动还是被动。线程B也会轮询互斥量状态并浪费处理器时间,或者在互斥量未锁定时被Sheduler被动释放。

在不同的C ++参考文献中,仅提到了线程被阻塞,而不是以哪种方式阻塞。

但是,难道std::mutex实现几乎不取决于所使用的平台和OS?

大卫·海姆

它是高度实现的定义,即使对于相同的编译器和操作系统

例如,在Visual Studio 2010中的VC ++上,std::mutex是使用Win32实现的CRITICAL_SECTIONEnterCriticalSection(CRITICAL_SECTION*)具有一些不错的功能:首先,它尝试CRITICAL_SECTION通过一次又一次地对锁进行迭代来锁定。在指定的迭代次数之后,它将进行内核调用,使线程进入睡眠状态,直到释放锁并再次开始整个交易时才再次唤醒。在这种情况下,该机制在进入睡眠之前一次又一次轮询锁,然后控制切换到内核。

Visual Studio 2012附带了一个不同的实现。std::mutex是用Win32互斥锁实现的。Win32互斥锁立即将控件移至内核。锁没有执行主动轮询。

您可以在答案中了解有关实现开关的信息:std :: mutex性能与win32相比CRITICAL_SECTION

因此,未指定互斥锁如何获取锁。最好不要依赖这种行为。

ps。不要手动锁定互斥锁,std::lock_guard而应使用同样,您可能希望使用condition_variable更精细的方式来控制同步。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

锁定C ++ 11 std :: unique_lock会导致死锁异常

C ++ 11 std :: threads与posix线程

停止等待std :: condition_variable的C ++ 11 std :: threads

将-std = c ++ 11传递给CMakeLists?

C ++ 11将std :: unique_lock <std :: mutex>传递给lambda

c ++ 11 std :: hash函数对象类的线程安全

C ++ 11 std :: regex替代

C ++ 11将std函数绑定到重载的静态方法

是否可以通过#define将g ++设置为遵循C ++ 11 ISO(-std = c ++ 11)?

c++ 无法将 'std::string' {aka 'std::__cxx11::basic_string'} 转换为 'std::string (*)[3]' {aka 'std::__cxx11::basic_string (*)[3] '}

标准C ++ 11是否保证std :: async(std :: launch :: async,func)在单独的线程中启动func?

为什么创建C ++ 11线程会导致致命信号?

如何同时填充c ++ 11 std :: map <std :: string,std :: bitset <N> *>(线程安全)而不会发生内存泄漏?

C ++-返回C ++ 11 std :: array

C ++:std :: async和std :: mutex在Linux上导致死锁,但在Windows上运行?

C ++ 11:从模板函数构建std :: tuple

C ++ 11 std :: list的基于范围的for循环

C ++ 11中的std :: sin变化?

C ++ 11 std :: function const重载歧义

C ++ 11 std :: thread奇怪的行为

C ++ 11中与std :: atomic的同步

C ++ 11 std :: thread与Windows CreateThread

C 11 std ::转发指针

std :: make_pair与C ++ 11

如何正确增加C ++ 11 std :: atomic?

来自c ++ 11的std :: thread问题

C ++ 11 std :: copy内部函数

在C ++ 11中std :: nearbyint vs std :: round

C ++ 11 std :: forward_as_tuple和std :: forward