#include #include #include #include atomic_bool flag[2]; atomic_int turn; int other( int x ) { return x == 0 ? 1 : 0; } atomic_int critical; void *worker( void *_tid ) { int tid = (int)_tid; flag[ tid ] = true; turn = other( tid ); while ( flag[ other( tid ) ] && turn == other( tid ) ) { } // critical start atomic_fetch_add_explicit( &critical, 1, memory_order_relaxed ); atomic_fetch_sub_explicit( &critical, 1, memory_order_relaxed ); // end flag[ tid ] = false; return 0; } int main() { pthread_t t1, t2; pthread_create( &t1, 0, worker, (void *)0 ); pthread_create( &t2, 0, worker, (void *)1 ); while ( true ) assert( atomic_load_explicit( &critical, memory_order_relaxed ) <= 1 ); pthread_join( t1, 0 ); pthread_join( t2, 0 ); return 0; }