Search code examples
goatomicuint

Are reads and writes for uint8 in golang atomic?


As in the title, are read and write operations regarding uint8, atomic? Logically it must be a single cpu instruction obviously to read and write for a 8 bit variable. But in any case, two cores could simultaneously read and write from the memory, is it possible to create a stale data this way?


Solution

  • There's no guarantee that the access on native types are on any platform atomic. This is why there is sync/atomic. See also the advice in the memory model documentation.

    Example for generic way of atomically setting a value (Play)

    var ax atomic.Value // may be globally accessible
    
    x := uint8(5)
    
    // set atomically
    ax.Store(x)
    
    x = ax.Load().(uint8)
    

    Probably more efficient solution for uint8 (Play):

    var ax int64 // may be globally accessible
    
    x := uint8(5)
    
    atomic.StoreInt64(&ax, 10)
    
    x = uint8(atomic.LoadInt64(&ax))
    
    fmt.Printf("%T %v\n", x, x)