为什么锁定std :: mutex不会阻塞线程

11 c++ concurrency c++11

我编写了以下代码来测试我的理解 std::mutex

int main() {
    mutex m;
    m.lock();
    m.lock(); // expect to block the thread
}
Run Code Online (Sandbox Code Playgroud)

然后我得到了一个system_error: device or resource busy.是不是第二个m.lock()应该阻止线程?

hmj*_*mjd 14

来自std::mutex:

在调用lock或try_lock之前,调用线程不得拥有互斥锁.

来自std::mutex::lock:

如果已经拥有互斥锁的线程调用了锁,则程序可能会死锁.或者,如果实现可以检测到死锁,则可以观察到resource_deadlock_would_occur错误情况.

例外条款:

发生错误时引发std :: system_error,包括来自底层操作系统的错误,这些错误会阻止锁定满足其规范.在抛出任何异常的情况下,互斥锁不会被锁定.

因此它不应该阻止线程.在您的平台上,实现似乎能够检测线程何时已经是锁的所有者并引发异常.如描述中所示,这可能不会发生在其他平台上.


Mik*_*our 8

是不是第二个m.lock()应该阻止线程?

不,它给出了未定义的行为.第二个m.lock()打破了这个要求:

C++ 11 30.4.1.2/7 要求:如果m是type std::mutex或者std::timed_mutex,则调用线程不拥有互斥锁.

看起来你的实现能够检测到调用线程拥有互斥锁并给出错误; 其他人可能无限期阻止,或以其他方式失败.