Я пытаюсь понять память в С++ 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 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();
}