首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >引导一个C++11 std::mutex将被阻塞的线程锁定为被动等待状态?

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

Stack Overflow用户
提问于 2015-10-05 14:06:57
回答 1查看 1.9K关注 0票数 4

我有以下情况:

两个C++11线程正在进行计算,它们通过std::mutex进行同步。

线程A锁定互斥对象,直到数据准备就绪,然后执行线程B。当互斥锁解除时,线程B开始工作。

线程B试图锁定互斥锁并被阻塞,直到线程A解锁为止。

代码语言:javascript
运行
复制
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的实现很难依赖于使用的平台和操作系统吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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来更精确地控制同步。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32950616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档