#include <iostream>
static volatile int *entered;
void once(void) {
int result;
result = __sync_val_compare_and_swap(entered, 0, 1); // cmpxchg になる
if (result == 1) {
return;
}
std::cout << "once" << std::endl;
}
int main() {
entered = new int;
*entered = 0;
once();
once();
return 0;
delete entered;
}
/* end */
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RhdGljIHZvbGF0aWxlIGludCAqZW50ZXJlZDsKCnZvaWQgb25jZSh2b2lkKSB7CiAgaW50IHJlc3VsdDsKICByZXN1bHQgPSBfX3N5bmNfdmFsX2NvbXBhcmVfYW5kX3N3YXAoZW50ZXJlZCwgMCwgMSk7ICAvLyBjbXB4Y2hnIOOBq+OBquOCiwoKICBpZiAocmVzdWx0ID09IDEpIHsKICAgIHJldHVybjsKICB9CiAgc3RkOjpjb3V0IDw8ICJvbmNlIiA8PCBzdGQ6OmVuZGw7Cn0KCmludCBtYWluKCkgewogIGVudGVyZWQgPSBuZXcgaW50OwogICplbnRlcmVkID0gMDsKCiAgb25jZSgpOwogIG9uY2UoKTsKICByZXR1cm4gMDsKICAKICBkZWxldGUgZW50ZXJlZDsKfQovKiBlbmQgKi8K