#include <iostream>
#include <thread>
#include <mutex>
#include <atomic>
#include <assert.h>
using namespace std;
std::atomic<bool> x;
atomic<bool> y;
atomic<int> z;
void write_x_then_y(){
x.store(true, memory_order_relaxed);
y.store(true, memory_order_relaxed);
}
void read_y_then_x(){
while(!y.load(memory_order_relaxed));
if (x.load(memory_order_relaxed)){
++z;
}
}
int main() {
x = false;
y = false;
z = 0;
std::thread a(write_x_then_y);
std::thread b(read_y_then_x);
a.join();
b.join();
assert(z.load() != 0);
return 0;
}
void write_x_read_x_write_y(){
x.store(true, memory_order_relaxed);
int z = x.load();
y.store(true, memory_order_relaxed);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dGhyZWFkPgojaW5jbHVkZSA8bXV0ZXg+CiNpbmNsdWRlIDxhdG9taWM+CiNpbmNsdWRlIDxhc3NlcnQuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0ZDo6YXRvbWljPGJvb2w+IHg7CmF0b21pYzxib29sPiB5OwphdG9taWM8aW50PiB6OwoKdm9pZCB3cml0ZV94X3RoZW5feSgpewoJeC5zdG9yZSh0cnVlLCBtZW1vcnlfb3JkZXJfcmVsYXhlZCk7Cgl5LnN0b3JlKHRydWUsIG1lbW9yeV9vcmRlcl9yZWxheGVkKTsKfQoKdm9pZCByZWFkX3lfdGhlbl94KCl7Cgl3aGlsZSgheS5sb2FkKG1lbW9yeV9vcmRlcl9yZWxheGVkKSk7CglpZiAoeC5sb2FkKG1lbW9yeV9vcmRlcl9yZWxheGVkKSl7CgkJKyt6OwoJfQp9CgppbnQgbWFpbigpIHsKCXggPSBmYWxzZTsKCXkgPSBmYWxzZTsKCXogPSAwOwoJc3RkOjp0aHJlYWQgYSh3cml0ZV94X3RoZW5feSk7CglzdGQ6OnRocmVhZCBiKHJlYWRfeV90aGVuX3gpOwoJYS5qb2luKCk7CgliLmpvaW4oKTsKCWFzc2VydCh6LmxvYWQoKSAhPSAwKTsKCXJldHVybiAwOwp9Cgp2b2lkIHdyaXRlX3hfcmVhZF94X3dyaXRlX3koKXsKCXguc3RvcmUodHJ1ZSwgbWVtb3J5X29yZGVyX3JlbGF4ZWQpOwoJaW50IHogPSB4LmxvYWQoKTsKCXkuc3RvcmUodHJ1ZSwgbWVtb3J5X29yZGVyX3JlbGF4ZWQpOwp9