我试图理解 c++11 中的内存栅栏,我知道有更好的方法可以做到这一点,原子变量等等,但想知道这种用法是否正确。我意识到这个程序没有做任何有用的事情,我只是想确保栅栏函数的使用符合我的想法。
基本上,该版本确保在围栏之前在此线程中所做的任何更改对围栏之后的其他线程都是可见的,并且在第二个线程中,对变量的任何更改在围栏之后的线程中立即可见?
我的理解正确吗?还是我完全错过了重点?
#include <iostream>
#include <atomic>
#include <thread>
int a;
void func1()
{
for(int i = 0; i < 1000000; ++i)
{
a = i;
// Ensure that changes to a to this point are visible to other threads
atomic_thread_fence(std::memory_order_release);
}
}
void func2()
{
for(int i = 0; i < 1000000; ++i)
{
// Ensure that this thread's view of a is up to date
atomic_thread_fence(std::memory_order_acquire);
std::cout << a;
}
}
int main()
{
std::thread t1 (func1);
std::thread t2 (func2);
t1.join(); t2.join();
}