这是我目前正在维护的一些代码的简化版本:
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/