一 简介
头文件<mutex>
class recursive_mutex; c++11
1. 调用线程从成功调用 lock 或 try_lock 开始占有recursive_mutex, 期间线程可以进行对 lock 或 try_lock的附加调用,所有权在线程调用 unlock 匹配次数时结束。
2. 线程占有recursive_mutex时,若其他线程要求recursive_mutex所有权,调用lock将被阻塞,调用try_lock将返回false.
3. 可锁定recursive_mutex的最大次数未指定的,但到达该数后,对 lock 的调用将抛出 std::system_error 而对 try_lock 的调用返回false;
4. 若recursive_mutex在仍被线程占有时被销毁,则程序行为未定义。recursive_mutex满足 mutex 和 标准布局类型的所有要求。
二 举例
M m;
void f()
{
m.lock();
// do sth
m.unlock();
}
void g()
{
m.lock();
f();
// do sth
m.unlock();
}
当M为非递归锁时,则程序会死锁; 如果M是递归锁能通过。但使用递归锁容易出现的问题是 f 和 g 均以为自己拿到了锁,然后却修改了同个对象,问题很难发现。
三 参考