为什么锁定 std::mutex 不会阻塞线程
Why locking a std::mutex doesn't block the thread
我写了下面的代码来测试我对std::mutex
int main() {
mutex m;
m.lock();
m.lock(); // expect to block the thread
}
然后是system_error: device or resource busy
。第二个m.lock()
不是应该阻止线程吗?
From std::mutex
:
在调用lock或try_lock之前,调用线程不能拥有互斥锁。
and from std::mutex::lock
:
如果锁被一个已经拥有互斥锁的线程调用,程序可能会死锁。或者,如果实现可以检测到死锁,则可能会观察到resource_deadlock_would_occurs错误条件。
和异常子句:
在发生错误时抛出std::system_error,包括来自底层操作系统的可能阻止锁满足其规范的错误。在抛出任何异常的情况下,互斥锁不会被锁定。
因此它不应该阻塞线程。在您的平台上,该实现似乎能够检测到线程何时已经是锁的所有者并引发异常。如描述所示,这在其他平台上可能不会发生。
是不是第二个
m.lock()
应该阻塞线程?
不,它给出了未定义的行为。第二个m.lock()
打破了这个要求:
c++ 11 30.4.1.2/7 require:如果m的类型为
std::mutex
或std::timed_mutex
,则调用线程不拥有该互斥锁。
看起来你的实现能够检测到调用线程拥有互斥锁并给出一个错误;其他可能会无限期阻塞,或以其他方式失败。
(当我写这个答案时,问题中没有提到std::mutex
)
这取决于你使用的互斥锁库和互斥锁类型——你还没有告诉我们。有些系统提供了一个"递归互斥锁",只有当它发生在同一个线程时才允许这样多次调用(那么在另一个线程可以锁定它之前,你必须有匹配数量的解锁),其他库认为这是一个错误,可能会优雅地失败(就像你的库一样)或有未定义的行为。
- std::mutex 如何防止线程修改?
- 是否需要 mutex() 来安全地同时访问具有 2 个线程的数组的不同元素?
- std::mutex作为一个成员变量对多个线程来说是安全的吗
- 死锁使用 std::mutex 来保护多个线程中的 cout
- 在 C++11 线程中,std::mutex 对内存可见性有什么保证?
- 在任何地方对C++中所有并行线程中的所有锁定和解锁实例使用相同的 std::mutex 和 lock 对象
- STD :: Mutex如何在不同的线程中解锁
- C 中的多线程程序:在标志变量上使用Mutex
- 我应该使用 std::atomic 还是 std::mutex 来避免线程竞争
- POSIX线程 - (MUTEX和条件变量)问题
- mutex::lock() 检查一次解锁状态是否已经被另一个线程锁定?
- 如何在不使用的情况下在 <mutex>C++11 中实现多线程安全单例
- 以std::mutex作为参数对成员函数进行线程处理
- Boost::类中的Mutex不是线程安全的
- 视频捕获中的Mutex和线程
- 为什么锁定 std::mutex 不会阻塞线程
- 收到此错误时如何实现非托管线程安全集合: <mutex> 使用 /clr 编译时不支持
- std::mutex 与 RAII 但在后台线程中完成和发布
- 史上最简单的Mutex.这个例子行得通吗?它是线程安全的吗
- 无法获取 std::mutex 以正确保护线程访问