#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);
}