c++ - 这段代码是线程安全的吗?

标签 c++ thread-safety lock-free

这是我目前正在维护的一些代码的简化版本:

int SomeFunc() 
{
  const long lIndex = m_lCurrentIndex;
  int nSum = 0;
  nSum += m_someArray[lIndex];
  nSum += m_someArray[lIndex];
  return nSum;
}

lCurrentIndex 由另一个线程定期更新。问题是;制作 m_CurrentIndex 的本地拷贝是否会确保对 m_someArray 的两次访问都使用相同的索引?

请注意,这是一个简化的示例;我正在考虑制作本地拷贝的概念,而不是此处显示的确切代码段。我知道编译器会将值放入寄存器,但它仍然是本地拷贝,而不是从 lCurrentIndex 读取两次。

谢谢!

编辑:初始分配是安全的,在我们的设置中都保证是 32 位的。 Edit2:并且它们在 32 位边界上正确对齐(忘了那个)

最佳答案

不,读取共享变量的本地初始化不一定是原子的。 (例如,考虑在 8 位平台上需要什么代码)通常,编写线程安全代码的唯一方法是使用编译器和/或操作系统指定的原子操作,或者使用操作系统锁定功能。

关于c++ - 这段代码是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1192537/

相关文章:

c++ - C++ 比较和交换例程中的无锁数据结构

c++ - boost 无锁使用用户定义类型

c++ - 将创建多少个 VTable?

c++ - 如何调用虚拟无效函数 C++?

scala - 线程安全地更新 Scala 集合

c++ - 我应该按什么顺序发送 callback() 并通知服务员?

c++ - 如何在模板构造函数中知道模板类型

c++ - 从列表中删除回调函数?

c++ - 在插入其他线程时有效地遍历 map

c++ - 无锁数据结构中的非 POD 类型