具有本地静态变量的ID生成器 - 线程安全?

Pos*_*don 6 c c++ thread-safety

下面的代码段是否会在多线程场景中按预期工作?

int getUniqueID()  
{  
    static int ID=0;  
    return ++ID;  
}
Run Code Online (Sandbox Code Playgroud)

这些ID不必连续 - 即使它跳过一个值,也没关系.可以说当这个函数返回时,返回的值在所有线程中都是唯一的吗?

FRo*_*owe 18

不,它不会.您的处理器需要执行以下步骤来执行此代码:

  • 从内存中获取ID到寄存器的值
  • 增加寄存器中的值
  • 将递增的值存储到内存中

如果在此(非原子)序列期间发生线程切换,则可能发生以下情况:

  • 线程a将值1提取到寄存器
  • 线程a递增值,因此寄存器现在包含2
  • 上下文切换
  • 线程b获取值1(仍在内存中)
  • 上下文切换
  • 将存储2线程化到内存并返回
  • 上下文切换
  • 线程b将其存储在寄存器中的值递增为2
  • 线程b(也)将值2存储到内存并返回2

所以,两个线程都返回2.


Whi*_*ind 5

不,比赛仍有潜力,因为增量不一定是原子的.如果使用原子操作来增加ID,这应该可行.