使用volatile作为原子

Cla*_*bel 4 c c++ concurrency multithreading atomic

如果我有这样的东西......

volatile long something_global = 0;

long some_public_func()
{
    return something_global++;
}
Run Code Online (Sandbox Code Playgroud)

当使用多个线程访问时,期望此代码不会中断(竞争条件)是否合理?如果它不是标准的,它仍然可以作为现代编译器的合理假设吗?

注意:所有我使用它的原因是原子增量和减量 - 没有什么比这更好的了.

dan*_*ben 16

不 - 易失并不意味着同步.它只是意味着每次访问都将返回最新的值(而不是在线程中本地缓存的副本).

后增量不是原子操作,它是内存访问,后跟内存写入.交错两个意味着该值实际上只增加一次.

  • Aaaaaaaaaaargh. (4认同)
  • @wowus:为什么不将你的唯一ID作为与线程本地计数器连接的线程ID?然后每个线程都可以生成自己的ID而无需锁定. (3认同)
  • Amardeep是对的 - 内存屏障是昂贵的部分,无论你使用原子增量还是锁定保护增量,它都会发生. (2认同)