Этот вопрос касается автономных заборов в C ++
В попытке инкапсулировать использование заборов выпуска и выпуска я написал следующий код:
#include <thread>
#include <atomic>
#include <cassert>
class sync {
std::atomic<bool> flag{false};
public:
void release()
{
std::atomic_thread_fence(std::memory_order_release);
flag.store(true, std::memory_order_relaxed);
}
bool acquire()
{
return flag.load(std::memory_order_relaxed);
std::atomic_thread_fence(std::memory_order_acquire); // Is this acquire fence observed by the application ?
}
};
int main()
{
sync s;
int data = 0;
std::thread t1{[&] { data = 12; s.release(); }};
std::thread t2{[&] { if (s.acquire()) assert(data==12); }};
t1.join(); t2.join();
}
Я считаю, чтозаборы расположены правильно («отпустить» перед магазином и «приобрести» после загрузки).
Я не уверен, действительно ли работает загрузка / получение.
Поскольку предел получения составляет после оператора загрузки / возврата, мне интересно, принимается ли он во внимание вообще?,
Правильно ли использовать этот забор?