[英]Unlocking a mutex locked by another thread
为什么解锁已经被另一个线程锁定的互斥锁会导致未定义的行为?
根据http://www.cplusplus.com/reference/mutex/mutex/unlock/的说明 ,如果说线程1锁定了一个互斥锁,然后线程2然后尝试在未锁定该互斥锁之前对其进行了解锁,则会导致未定义行为。
在成员函数unlock()
上查看此文档,这是您要链接其文档的成员函数: https : //en.cppreference.com/w/cpp/thread/mutex/unlock
它指出:
std :: mutex :: unlock()
解锁互斥锁。
互斥锁必须由当前执行线程锁定,否则, 该行为是undefined 。
因此,我认为文档只是指出,如果线程尝试解锁它不拥有的互斥锁,则会导致未定义的行为。
对于与问题标题有关的问题:锁定另一个线程拥有的锁是一个明确定义的行为(这就是为什么我们拥有std::mutex
) https://en.cppreference.com/w/cpp/thread/mutex/锁 :
std :: mutex :: lock()
锁定互斥锁。 如果另一个线程已经锁定了互斥锁,则对锁的调用将阻止执行,直到获得该锁为止。
附带说明,直接解锁互斥锁通常不是一个好主意,您应该使用RAII包装器,如std::lock_guard
您提供的链接实际上是关于双重解锁,而不是双重锁定。 但是,该操作(即从其他线程解锁互斥锁,而所有者线程未锁定互斥锁)是UB,因为该语言未定义应如何实现互斥锁,因此(这纯粹是推测)启用了二进制锁,哪个双重解锁实际上可能会锁定...
根据http://www.cplusplus.com/reference/mutex/mutex/unlock/ :
互斥锁上的所有锁定和解锁操作均遵循单个总顺序,并且所有可见效果在锁定操作和同一对象的先前解锁操作之间同步。 如果互斥锁当前未被调用线程锁定,则它将导致未定义的行为。
这只是意味着您应始终(在同一线程中)在解锁之前调用锁 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.