mat*_*ind 4 c++ multithreading mutex locking c++11
当我尝试运行以下代码时,我得到了令人惊讶和冲突的行为.
#include <iostream>
#include <mutex>
int main() {
std::mutex mtx;
std::unique_lock<std::mutex> lock1(mtx);
std::unique_lock<std::mutex> lock2(mtx, std::try_to_lock);
std::cout << "lock1 owns lock: " << lock1.owns_lock() << std::endl;
std::cout << "lock2 owns lock: " << lock2.owns_lock() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
当我在我的计算机上运行它(使用clang ++ 4.0.1或g ++ 7.3.0的linux)时,它打印出两者lock1并lock2拥有锁(令人惊讶).当我运行它时cpp.sh它说它lock1确实拥有,但lock2没有拥有锁(我所期望的).
所有人都使用C++ 11而-Wall没有优化.
Sla*_*ica 12
如构造函数的文档中所述std::unque_lock:
5)尝试通过调用m.try_lock()来阻止关联的互斥锁而不会阻塞.如果当前线程已经拥有互斥锁,则该行为是未定义的,除非互斥锁是递归的.
重点是我的.因为std::mutex不是递归你有UB -std::mutex::try_lock()
如果已经拥有互斥锁的线程调用try_lock,则行为未定义.
| 归档时间: |
|
| 查看次数: |
333 次 |
| 最近记录: |