#include <thread>
#include <atomic>
#include <cassert>
#include <vector>
std::vector<int> data;
std::atomic<int> flag = ATOMIC_VAR_INIT(0);
void thread_1()
{
data.push_back(42);
flag.store(1, std::memory_order_release);
}
void thread_2()
{
int expected=1;
while (!flag.compare_exchange_strong(expected, 2, std::memory_order_acq_rel)) {
expected = 1;
}
}
void thread_3()
{
while (flag.load(std::memory_order_acquire) < 2)
;
assert(data.at(0) == 42); // will never fire
}
int main()
{
std::thread a(thread_1);
std::thread b(thread_2);
std::thread c(thread_3);
a.join(); b.join(); c.join();
}
I2luY2x1ZGUgPHRocmVhZD4KI2luY2x1ZGUgPGF0b21pYz4KI2luY2x1ZGUgPGNhc3NlcnQ+CiNpbmNsdWRlIDx2ZWN0b3I+CiAKc3RkOjp2ZWN0b3I8aW50PiBkYXRhOwpzdGQ6OmF0b21pYzxpbnQ+IGZsYWcgPSBBVE9NSUNfVkFSX0lOSVQoMCk7CiAKdm9pZCB0aHJlYWRfMSgpCnsKICAgIGRhdGEucHVzaF9iYWNrKDQyKTsKICAgIGZsYWcuc3RvcmUoMSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsZWFzZSk7Cn0KIAp2b2lkIHRocmVhZF8yKCkKewogICAgaW50IGV4cGVjdGVkPTE7CiAgICB3aGlsZSAoIWZsYWcuY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoZXhwZWN0ZWQsIDIsIHN0ZDo6bWVtb3J5X29yZGVyX2FjcV9yZWwpKSB7CiAgICAgICAgZXhwZWN0ZWQgPSAxOwogICAgfQp9CiAKdm9pZCB0aHJlYWRfMygpCnsKICAgIHdoaWxlIChmbGFnLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfYWNxdWlyZSkgPCAyKQogICAgICAgIDsKICAgIGFzc2VydChkYXRhLmF0KDApID09IDQyKTsgLy8gd2lsbCBuZXZlciBmaXJlCn0KIAppbnQgbWFpbigpCnsKICAgIHN0ZDo6dGhyZWFkIGEodGhyZWFkXzEpOwogICAgc3RkOjp0aHJlYWQgYih0aHJlYWRfMik7CiAgICBzdGQ6OnRocmVhZCBjKHRocmVhZF8zKTsKICAgIGEuam9pbigpOyBiLmpvaW4oKTsgYy5qb2luKCk7Cn0=