【发布时间】:2017-11-09 11:58:12
【问题描述】:
在 C++14 中有这样的句式:
Different threads of execution are always allowed to access (read and modify) different memory locations concurrently, with no interference and no synchronization requirements.
struct S {
char a; // memory location #1
int b : 5; // memory location #2
int c : 11, // memory location #2 (continued)
: 0,
d : 8; // memory location #3
struct {
int ee : 8; // memory location #4
} e;
} obj; // The object 'obj' consists of 4 separate memory locations
这意味着我们可以使用两个线程来改变 S s::a 和 S s::b 而无需考虑 S s 的同步?
【问题讨论】:
-
我很确定位域不会启动新的内存位置,即使它们跨越多个字节并且某些部分与其他字节对齐。请注意,虽然允许将不同的成员视为不同的实体(至少,当它们不是位字段时),但这是一个坏主意,因为虚假共享只会减慢您的程序。
-
什么是S?我在给定的结构中看不到任何“s”。
-
@Dietmar 这看起来像一个答案,是的,位字段的行为就像你说的那样,除非用
: 0明确分隔 -
“作为一种特殊情况,宽度为零的未命名位域指定下一个位域在分配单元边界处的对齐方式”。不确定“分配单元边界”是否意味着“内存位置”。
-
@PasserBy:在讨论数据竞争和位字段的文本中,我没有看到对位字段中的
:0字段进行任何特殊处理。更具体地说,我认为关于数据竞争的文本无论如何都不会谈论内存位置,而是谈论对象或位域。虽然该示例取自内存模型部分,但它似乎并不是数据竞争的特殊情况。