繁体   English   中英

解锁另一个线程锁定的互斥锁

[英]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::mutexhttps://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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM