|
1
7
其他人已经说过了,但为了清楚起见,我认为你需要这样做:
然后简单地说:
换句话说,计数器是原子的,而不是结构。结构只是用来将它们组合在一起并初始化它们。 彼得编辑
如果同时使用来自不同线程的这些计数器,则可能需要将每个计数器放在单独的缓存线中,以避免线程之间的错误共享争用。(通常为64字节)。你可以使用C++ 11
alignas
在成员上让编译器填充结构布局,或手动插入一些虚拟对象
由我编辑 关于一般理解缓存的良好链接 here . 值得一读。英特尔缓存线似乎是64字节这些天,从只是一个快速的一点谷歌,但不要引用我。 我的另一个编辑 在下面的评论中,有很多关于使用STD:和原子来检查一个(任意)类或结构的前后关系,例如。
但我的问题是:
什么时候有用?
具体地说,正如ivaigult指出的,不能使用STD::原子来改变个体成员。
我能想到的唯一合法的用例是,当您希望能够共享(例如)一个 struct tm 在线程之间,这样线程就不会看到它处于不一致的状态。然后,如果结构很小,您可能会在特定平台上没有锁的情况下离开,这很有用。如果做不到的话,请注意其中的含义(对于实时代码来说,优先级反转是最严重的)。
如果你
做
想分享一个
现在我可以做(例如):
这允许您以线程安全的方式更新两个(可能以某种方式链接)变量。 对于那些经验丰富的竞选者来说,这些都是显而易见的,我很抱歉,但我想澄清我自己的想法。实际上这和OP的问题无关。 |
|
|
2
1
在大多数情况下
而且,
另外,如果目标CPU不支持这种大小的结构的原子操作,
你可以在演示中看到
所以,你最好
|
|
|
BeeOnRope · 原子是否提供原子行为,而不考虑排序? 8 年前 |