(libc.info.gz) Non-atomic Example

Info Catalog (libc.info.gz) Atomic Data Access (libc.info.gz) Atomic Types
 
 24.4.7.1 Problems with Non-Atomic Access
 ........................................
 
 Here is an example which shows what can happen if a signal handler runs
 in the middle of modifying a variable.  (Interrupting the reading of a
 variable can also lead to paradoxical results, but here we only show
 writing.)
 
      #include <signal.h>
      #include <stdio.h>
 
      volatile struct two_words { int a, b; } memory;
 
      void
      handler(int signum)
      {
         printf ("%d,%d\n", memory.a, memory.b);
         alarm (1);
      }
 
      int
      main (void)
      {
         static struct two_words zeros = { 0, 0 }, ones = { 1, 1 };
         signal (SIGALRM, handler);
         memory = zeros;
         alarm (1);
         while (1)
           {
             memory = zeros;
             memory = ones;
           }
      }
 
    This program fills 'memory' with zeros, ones, zeros, ones,
 alternating forever; meanwhile, once per second, the alarm signal
 handler prints the current contents.  (Calling 'printf' in the handler
 is safe in this program because it is certainly not being called outside
 the handler when the signal happens.)
 
    Clearly, this program can print a pair of zeros or a pair of ones.
 But that's not all it can do!  On most machines, it takes several
 instructions to store a new value in 'memory', and the value is stored
 one word at a time.  If the signal is delivered in between these
 instructions, the handler might find that 'memory.a' is zero and
 'memory.b' is one (or vice versa).
 
    On some machines it may be possible to store a new value in 'memory'
 with just one instruction that cannot be interrupted.  On these
 machines, the handler will always print two zeros or two ones.
 
Info Catalog (libc.info.gz) Atomic Data Access (libc.info.gz) Atomic Types
automatically generated by info2html