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

c编译器如何保证常量成员变量的线程安全?

发布时间:2020-12-16 07:08:21 所属栏目:百科 来源:网络整理
导读:C 11x标准改变了“const”关键字的语义. 现在它意味着真正的线程安全. 据我所知,const成员变量等于 java final字段. 我想在CPU icore 7 G 4.7.1上检查一下. 我使用as -std = c 0x -pthread -DCONST编译以下代码.两个可执行文件都相同汇编程序版本没有* fence
C 11x标准改变了“const”关键字的语义.
现在它意味着真正的线程安全.
据我所知,const成员变量等于 java final字段.

我想在CPU icore 7 G 4.7.1上检查一下.

我使用as -std = c 0x -pthread -DCONST编译以下代码.两个可执行文件都相同汇编程序版本没有* fence指令.
我希望在构造函数的末尾看到* fence.

class Big {
public:
#ifdef CONST
  const
#endif
  long a;
  Big(long a) : a(a) {
  }
  void check()
 #ifdef CONST
  const 
 #endif
  {
    assert(a == 123L);
  }
};

int main() {
  Big b(123L);
  thread t([b] () { b.check(); });
  return 0;
}

解决方法

这更像是一个普通的计算机科学问题而不是代码问题,但这很好,甚至有趣.

让我们确定一些观点,如果您对这些观点或随后的推理有任何疑问,请告诉我.为了清楚起见,我用“观察”这个词来表示“读”,并修改为“写”的意思.这不是一个正式的证据.

>只要没有线程同时修改该对象,任意数量的线程可以同时观察对象而不会产生竞争条件.
> const对象在初始化期间被修改,在该对象的生命周期内不会被修改(我认为除了破坏).
>初始化在对象的生命周期中发生一次,在一个线程中,在该对象可以被修改或观察之前(技术上可以访问未初始化的对象,但是如果你设法将其拉出来,很多东西都会被破坏而不管线程安全).

#2和#3保证不能同时修改和观察const成员,这是规则#1的线程安全.

现在……可变更改的东西,一旦你开始创建可变成员,类作者就有责任确保使用可变成员的const方法以线程安全的方式处理.

因此,编译器不保证线程安全……但逻辑确保线程安全.只要一个对象是const,它的所有可变成员都以线程安全的方式处理,并且该对象的所有const成员都遵守这些规则,您可以保证线程安全.

据我所知,C 11的变化是std :: objects之前没有保证行为良好的线程安全的const成员,我们现在有了这个保证.

视频Herb Sutter – You don’t know [blank] and [blank]是我可以告诉消息来源C 11保证const ==线程安全的声明,并且很好地解释了声明.

(编辑:李大同)

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

    推荐文章
      热点阅读