【发布时间】:2013-08-18 20:12:29
【问题描述】:
假设您有以下定义:
struct X
{
char a, b;
};
X x;
现在假设您有两个线程,其中一个线程读写x.a,但从不访问x.b,而另一个线程读写x.b,但从不访问x.a。两个线程都没有使用任何锁或其他同步原语。这可以保证在 C++11 中工作吗?还是算作访问同一个对象,因此需要锁?
【问题讨论】:
-
没关系,它们是两个不同的位置。我会留给有能力证明的人来回答。
-
@Mat 但是 C/C++ 中的每个对象/原语都必须至少有 1 个字节。而 1 个字节是“最小的可寻址单元”。
-
我认为答案就在某处isocpp.org/blog/2013/02/…
-
@Mat 我记得在某处听说该标准要求所有字段成员具有不同的地址。虽然这是我从聊天中听到的第三手信息。我会等待有人确认/拒绝。
-
请注意,虽然这是安全的,但它可能会导致false sharing 并降低性能。
标签: c++ multithreading c++11 thread-safety memory-model