Can shared memory be read and validated without mutexes?
        Posted  
        
            by Bribles
        on Stack Overflow
        
        See other posts from Stack Overflow
        
            or by Bribles
        
        
        
        Published on 2010-03-31T17:16:40Z
        Indexed on 
            2010/04/01
            16:53 UTC
        
        
        Read the original article
        Hit count: 344
        
On Linux I'm using shmget and shmat to setup a shared memory segment that one process will write to and one or more processes will read from.  The data that is being shared is a few megabytes in size and when updated is completely rewritten; it's never partially updated.
I have my shared memory segment laid out as follows:
    -------------------------
    | t0 | actual data | t1 |
    -------------------------
where t0 and t1 are copies of the time when the writer began its update (with enough precision such that successive updates are guaranteed to have differing times). The writer first writes to t1, then copies in the data, then writes to t0. The reader on the other hand reads t0, then the data, then t1. If the reader gets the same value for t0 and t1 then it considers the data consistent and valid, if not, it tries again.
Does this procedure ensure that if the reader thinks the data is valid then it actually is?
Do I need to worry about out-of-order execution (OOE)?  If so, would the reader using memcpy to get the entire shared memory segment overcome the OOE issues on the reader side?  (This assumes that memcpy performs it's copy linearly and ascending through the address space.  Is that assumption valid?)
© Stack Overflow or respective owner