根据C++ Reference,mutex.lock()
是memory_order_acquire
操作,而mutex.unlock()
是memory_order_release
操作。
但是,memory_order_acquire
和memory_order_release
仅对非原子和松弛原子操作有效。
memory_order: Release-Acquire ordering关于cppreference
如果线程A中的原子存储被标记为
memory_order_release
,而线程B中来自同一变量的原子加载被标记为memory_order_acquire
,则发生的所有内存写入(非原子和宽松原子)-从线程A的角度来看,在原子存储之前,在线程B中成为可见的副作用
C ++中的互斥体能否保证原子操作的可见性?一个例子如下。代码A
是否可以在mu.lock()
之前重新排序,并且线程b
将x
读为false
?
#include <thread>
#include <atomic>
#include <cassert>
#include <iostream>
#include <unistd.h>
std::atomic<bool> x = {false};
std::mutex mu;
void write_x(){
mu.lock();
std::cout << "write_x" << std::endl;
x.store(true,std::memory_order_release);
mu.unlock();
}
void read_x() {
mu.lock();
std::cout << "read_x" << std::endl;
assert(x.load(std::memory_order_acquire)); // A
mu.unlock();
}
int main() {
std::thread a(write_x);
usleep(1);
std::thread b(read_x);
a.join(); b.join();
return 0;
}