// atomic::operator=/operator T example:
#include <iostream> // std::cout
#include <atomic> // std::atomic
#include <thread> // std::thread, std::this_thread::yield
std::atomic<int> foo {0};
void set_foo(int x) {
foo = x;
}
void print_foo() {
while (foo==0) { // wait while foo=0
std::this_thread::yield();
}
std::cout << "foo: " << foo << '\n';
}
int main ()
{
std::thread first (print_foo);
std::thread second (set_foo,10);
first.join();
second.join();
return 0;
}
Ly8gYXRvbWljOjpvcGVyYXRvcj0vb3BlcmF0b3IgVCBleGFtcGxlOgojaW5jbHVkZSA8aW9zdHJlYW0+ICAgICAgIC8vIHN0ZDo6Y291dAojaW5jbHVkZSA8YXRvbWljPiAgICAgICAgIC8vIHN0ZDo6YXRvbWljCiNpbmNsdWRlIDx0aHJlYWQ+ICAgICAgICAgLy8gc3RkOjp0aHJlYWQsIHN0ZDo6dGhpc190aHJlYWQ6OnlpZWxkCgpzdGQ6OmF0b21pYzxpbnQ+IGZvbyB7MH07Cgp2b2lkIHNldF9mb28oaW50IHgpIHsKICBmb28gPSB4Owp9Cgp2b2lkIHByaW50X2ZvbygpIHsKICB3aGlsZSAoZm9vPT0wKSB7ICAgICAgICAgICAgIC8vIHdhaXQgd2hpbGUgZm9vPTAKICAgIHN0ZDo6dGhpc190aHJlYWQ6OnlpZWxkKCk7CiAgfQogIHN0ZDo6Y291dCA8PCAiZm9vOiAiIDw8IGZvbyA8PCAnXG4nOwp9CgppbnQgbWFpbiAoKQp7CiAgc3RkOjp0aHJlYWQgZmlyc3QgKHByaW50X2Zvbyk7CiAgc3RkOjp0aHJlYWQgc2Vjb25kIChzZXRfZm9vLDEwKTsKICBmaXJzdC5qb2luKCk7CiAgc2Vjb25kLmpvaW4oKTsKICByZXR1cm4gMDsKfQ==