下面这段代码在多线程场景下是否能正常运行?
int getUniqueID()
{
static int ID=0;
return ++ID;
}
ID 不必是连续的 - 即使它跳过一个值,也没关系。 是不是说这个函数返回的时候,返回的值在所有线程中都是唯一的?
最佳答案
不,不会。您的处理器将需要执行以下步骤来执行此代码:
- 从内存中获取 ID 的值到寄存器中
- 增加寄存器中的值
- 将增加的值存入内存
如果在此(非原子)序列期间发生线程切换,则会发生以下情况:
- 线程a取值1到寄存器
- 线程 a 递增该值,因此寄存器现在包含 2
- 上下文切换
- 线程 b 获取值 1(仍在内存中)
- 上下文切换
- 线程 a 存储 2 到内存并返回
- 上下文切换
- 线程 b 将它存储在其寄存器中的值递增到 2
- 线程 b(也)将值 2 存储到内存并返回 2
因此,两个线程都返回 2。
关于c++ - 具有局部静态变量的 ID 生成器 - 线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2705679/