c++ - 具有局部静态变量的 ID 生成器 - 线程安全?

标签 c++ c thread-safety

下面这段代码在多线程场景下是否能正常运行?

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/

相关文章:

c++ - 无竞争线程锁的实际成本

python - Python 内置容器是线程安全的吗?

c++ - 从对象C++中的文件读取内容时发生段错误

c++ - 在 C++ 中用字符串切换大小写

c - 为什么if条件总是为真?

c - GCC 4.5/Ubuntu 11.04 是自动线程代码吗?

C++ 互斥量和函数参数

c++ - 如果 std::make_unique 从未被调用,为什么在默认成员初始化中不需要参数?

c++ - vector<string> 数组发生了什么?

c - 如何填充短字符串以用作 AES key ?