c编译器如何保证常量成员变量的线程安全?
C 11x标准改变了“const”关键字的语义.
现在它意味着真正的线程安全. 据我所知,const成员变量等于 java final字段. 我想在CPU icore 7 G 4.7.1上检查一下. 我使用as -std = c 0x -pthread -DCONST编译以下代码.两个可执行文件都相同汇编程序版本没有* 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; } 解决方法
这更像是一个普通的计算机科学问题而不是代码问题,但这很好,甚至有趣.
让我们确定一些观点,如果您对这些观点或随后的推理有任何疑问,请告诉我.为了清楚起见,我用“观察”这个词来表示“读”,并修改为“写”的意思.这不是一个正式的证据. >只要没有线程同时修改该对象,任意数量的线程可以同时观察对象而不会产生竞争条件. #2和#3保证不能同时修改和观察const成员,这是规则#1的线程安全. 现在……可变更改的东西,一旦你开始创建可变成员,类作者就有责任确保使用可变成员的const方法以线程安全的方式处理. 因此,编译器不保证线程安全……但逻辑确保线程安全.只要一个对象是const,它的所有可变成员都以线程安全的方式处理,并且该对象的所有const成员都遵守这些规则,您可以保证线程安全. 据我所知,C 11的变化是std :: objects之前没有保证行为良好的线程安全的const成员,我们现在有了这个保证. 视频Herb Sutter – You don’t know [blank] and [blank]是我可以告诉消息来源C 11保证const ==线程安全的声明,并且很好地解释了声明. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |