duangua5308 2016-03-21 14:13
浏览 128


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?

  • 写回答

2条回答 默认 最新

  • dsfs1233 2016-03-21 14:18

    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
    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
    ", x, x)
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
  • dtpfia3334 2016-03-21 14:17

    No. If you want atomic operations, you can use the sync/atomic package.

    If you mean "would 8bit operations be atomic even if I ignore the Go memory model?", then the answer is still, it depends probably not.

    If the hardware guarantees atomicity of read/write operations, then it might be atomic. But that still doesn't guarantee cache coherence, or compiler optimizations from reordering operations. You need to serialize the operations somehow, with the primitives Go provides in the "atomic" package, and using the "sync" package and channels to coordinate between goroutines.




  • ¥50 burgers方程求逆
  • ¥15 matlab最小二乘法拟合非线性曲线提问
  • ¥15 电脑锁屏时vba运行SAP,excel数据不能复制到SAP
  • ¥50 74LS系列 74LS00 74LS04设计一个RS485电路(关键词-差分)
  • ¥30 各位help写一下代码
  • ¥15 在运行SDEdit模型下载不了
  • ¥15 求51控制l298n驱动的小车中超声波避障怎么写
  • ¥15 电脑连上WIFI却用不了
  • ¥30 MATLAB在RLC电路的固有响应和阶跃响应GUI仿真报告
  • ¥15 hyper-v出现的问题