是否符合以下代码标准?x
(或者可以在不原子化的情况下使其符合要求volatile
吗?)
这类似于之前的问题,但是我想引用 C++ 标准的相关部分。
我担心的是原子store()
并且load()
没有为非原子变量(x
在下面的示例中)提供足够的编译器障碍以正确释放和获取语义。
我的目标是实现无锁原语,例如队列,它可以在线程之间传输指向常规 C++ 数据结构的指针。
#include <atomic>
#include <chrono>
#include <iostream>
#include <thread>
int x; // regular variable, could be a complex data structure
std::atomic<int> flag { 0 };
void writer_thread() {
x = 42;
// release value x to reader thread
flag.store(1, std::memory_order_release);
}
bool poll() {
return (flag.load(std::memory_order_acquire) == 1);
}
int main() {
x = 0;
std::thread t(writer_thread);
// "reader thread" ...
// sleep-wait is just for the test.
// production code calls poll() at specific points
while (!poll())
std::this_thread::sleep_for(std::chrono::milliseconds(50));
std::cout << x << std::endl;
t.join();
}