加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 此代码是否是线程安全的?

发布时间:2020-12-16 06:49:04 所属栏目:百科 来源:网络整理
导读:这是我正在维护的一些代码的简化版本: int SomeFunc() { const long lIndex = m_lCurrentIndex; int nSum = 0; nSum += m_someArray[lIndex]; nSum += m_someArray[lIndex]; return nSum;} lCurrentIndex由另一个线程定期更新.问题是;将制作m_CurrentIndex
这是我正在维护的一些代码的简化版本:

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位平台上需要什么代码)通常,编写线程安全代码的唯一方法是使用编译器和/或OS指定的原子操作,或使用操作系统锁定功能.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读