Page 62 - C-Language
P. 62

Chapter 6: Atomics




        Syntax



            •  #ifdef __STDC_NO_ATOMICS__
            •  # error this implementation needs atomics
            •  #endif
            •  #include <stdatomic.h>

            •  unsigned _Atomic counter = ATOMIC_VAR_INIT(0);


        Remarks


        Atomics as part of the C language are an optional feature that is available since C11.


        Their purpose is to ensure race-free access to variables that are shared between different threads.
        Without atomic qualification, the state of a shared variable would be undefined if two threads
        access it concurrently. Eg an increment operation (++) could be split into several assembler
        instructions, a read, the addition itself and a store instruction. If another thread would be doing the
        same operation their two instruction sequences could be intertwined and lead to an inconsistent
        result.

            •  Types: All object types with the exception of array types can be qualified with _Atomic.


            •  Operators: All read-modify-write operators (e.g ++ or *=) on these are guaranteed to be
              atomic.

            •  Operations: There are some other operations that are specified as type generic functions,
              e.g atomic_compare_exchange.


            •  Threads: Access to them is guaranteed not to produce data race when they are accessed
              by different threads.

            •  Signal handlers: Atomic types are called lock-free if all operations on them are stateless. In
              that case they can also be used to deal state changes between normal control flow and a
              signal handler.


            •  There is only one data type that is guaranteed to be lock-free: atomic_flag. This is a minimal
              type who's operations are intended to map to efficient test-and-set hardware instructions.

        Other means to avoid race conditions are available in C11's thread interface, in particular a mutex
        type mtx_t to mutually exclude threads from accessing critical data or critical sections of code. If
        atomics are not available, these must be used to prevent races.


        Examples



        atomics and operators




        https://riptutorial.com/                                                                               38
   57   58   59   60   61   62   63   64   65   66   67