小编Fli*_*pvs的帖子

c++11 及更高版本中 mutex.lock() 和 .unlock() 的确切线程间重新排序约束是什么?

根据https://en.cppreference.com/w/cpp/atomic/memory_order mutex.lock()mutex.unlock()是获取和释放操作。获取操作使得无法在它前面重新排序后面的指令。并且释放操作使得在它之后无法重新排序之前的指令。这使得以下代码:

[Thread 1]
mutex1.lock();
mutex1.unlock();
mutex2.lock();
mutex2.unlock();
[Thread 2]
mutex2.lock();
mutex2.unlock();
mutex1.lock();
mutex1.unlock();
Run Code Online (Sandbox Code Playgroud)

可以重新排序为以下(可能是死锁)代码:

[Thread 1]
mutex1.lock();
mutex2.lock();
mutex1.unlock();
mutex2.unlock();
[Thread 2]
mutex2.lock();
mutex1.lock();
mutex2.unlock();
mutex1.unlock();
Run Code Online (Sandbox Code Playgroud)

这种重新排序是否可能发生。或者有什么规则阻止它?

c++ mutex memory-barriers language-lawyer c++11

7
推荐指数
1
解决办法
223
查看次数

标签 统计

c++ ×1

c++11 ×1

language-lawyer ×1

memory-barriers ×1

mutex ×1