void SIGTERM_handler(int sig) { if( atomic_load_explicit( &guide, memory_order_relaxed) == 1) { atomic_signal_fence(memory_order_acquire); int d = atomic_load_explicit( &data, memory_order_relaxed); assert(d == 100); // Condition fulfilled! // ... } _Exit(0); }
int main(void) { if( signal(SIGTERM, SIGTERM_handler) == SIG_ERR) perror("signal"), exit(1); // ... atomic_store_explicit( &data, 100, memory_order_relaxed); atomic_signal_fence( memory_order_release); atomic_store_explicit( &guide, 1, memory_order_relaxed); // ... return 0; }
TEST(stdatomic, atomic_signal_fence) { atomic_signal_fence(memory_order_relaxed); atomic_signal_fence(memory_order_consume); atomic_signal_fence(memory_order_acquire); atomic_signal_fence(memory_order_release); atomic_signal_fence(memory_order_acq_rel); atomic_signal_fence(memory_order_seq_cst); }
int main(int argc, char** argv) { atomic_bool flag; atomic_store_bool(&flag, false); assert( false == atomic_exchange_bool(&flag, true) ); assert( true == atomic_exchange_bool(&flag, true) ); atomic_thread_fence(memory_order_seq_cst); atomic_signal_fence(memory_order_seq_cst); { atomic_uint_least8_t tmp; atomic_load_uint_least8_t(&tmp); } /* test(uint_least8_t); test(uint_least16_t); test(uint_least32_t); test(uint_least64_t); test(uintptr_t); */ return 0; }
int main () { atomic_thread_fence (memory_order_relaxed); atomic_thread_fence (memory_order_consume); atomic_thread_fence (memory_order_acquire); atomic_thread_fence (memory_order_release); atomic_thread_fence (memory_order_acq_rel); atomic_thread_fence (memory_order_seq_cst); atomic_signal_fence (memory_order_relaxed); atomic_signal_fence (memory_order_consume); atomic_signal_fence (memory_order_acquire); atomic_signal_fence (memory_order_release); atomic_signal_fence (memory_order_acq_rel); atomic_signal_fence (memory_order_seq_cst); return 0; }