c++ - 为什么在 C++ 中互斥锁的使用是正确的?
问题描述
我之前被问过一个关于互斥锁的问题,代码工作正常,但我对这个结果感到困惑:</p>
::std::mutex s_mutex;
void funcA()
{
s_mutex.lock();
printf( "funcA \n" );
s_mutex.unlock();
}
void funcB()
{
s_mutex.lock();
funcA();
printf( "funcB \n" );
s_mutex.unlock();
}
int main()
{
funcB();
return 0;
}
它工作正常,打印出我没想到的:</p>
funcA
funcB
但为什么?这个函数在主线程中被调用并且似乎调用了两次锁。
解决方案
正如@Quentin 所提到的,多次锁定std::mutex
一个线程会导致未定义的行为。要允许线程多次锁定互斥对象,您可以使用std::recursive_mutex。
递归互斥锁是一个可锁定对象,就像互斥锁一样,但允许同一个线程获得对互斥锁对象的多个级别的所有权。
这允许从已经锁定它的线程锁定(或尝试锁定)互斥对象,从而获得对互斥对象的新级别所有权:互斥对象实际上将保持锁定拥有线程,直到其成员解锁被称为很多倍于这个级别的所有权。
推荐阅读
- html - 改进 django 中的众多选择
- java - 环境之间的时区差异
- mongodb - Mongodb - 如何为 JSON 字段创建全文索引?
- c++ - gcc 4.8.5 和 gcc 8.1.0 之间的随机数生成差异
- javascript - .append() 通过索引号乘以 jQuery
- python - Python、MySQLConnector、MySQLCursor.fetchall() 抛出“无结果集”错误,尽管查询返回行
- vba - VBA 电子邮件签名代码证明
- c# - 如何在c#中将外部html文件转换为PDF
- sql - 准备查询的结果不一致以查找最后一个插入 ID
- css - 复选框未选中