#include <iostream>
#include <thread>
#include <vector>
#include <atomic>
std::atomic_flag spinlock = ATOMIC_FLAG_INIT;
void thread_func()
{
while(spinlock.test_and_set());
std::cout << "thread_func() printing!" << std::endl;
spinlock.clear();
}
int main()
{
spinlock.test_and_set();
std::vector<std::thread> threads;
for(unsigned int i = 0; i < 10; ++i)
threads.emplace_back(thread_func);
spinlock.clear();
for(auto& t : threads)
t.join();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dGhyZWFkPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YXRvbWljPgoKc3RkOjphdG9taWNfZmxhZyBzcGlubG9jayA9IEFUT01JQ19GTEFHX0lOSVQ7Cgp2b2lkIHRocmVhZF9mdW5jKCkKewogICAgd2hpbGUoc3BpbmxvY2sudGVzdF9hbmRfc2V0KCkpOwogICAgc3RkOjpjb3V0IDw8ICJ0aHJlYWRfZnVuYygpIHByaW50aW5nISIgPDwgc3RkOjplbmRsOwogICAgc3BpbmxvY2suY2xlYXIoKTsKfQoKCmludCBtYWluKCkKewogICAgc3BpbmxvY2sudGVzdF9hbmRfc2V0KCk7CiAgICAKICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dGhyZWFkPiB0aHJlYWRzOwogICAgZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IDEwOyArK2kpCiAgICAgICAgdGhyZWFkcy5lbXBsYWNlX2JhY2sodGhyZWFkX2Z1bmMpOwogICAgc3BpbmxvY2suY2xlYXIoKTsKICAgIAogICAgZm9yKGF1dG8mIHQgOiB0aHJlYWRzKQogICAgICAgIHQuam9pbigpOwp9