【发布时间】:2020-04-18 00:23:37
【问题描述】:
C++ 标准中关于多线程内存模型的部分我不理解。
A 可见的副作用 A 在标量对象或位域 M 上相对于 M 的值计算 B 满足条件:
A 发生在 B和
之前X 对 M 没有其他副作用,即 A 发生在 X 之前,X 发生在 B 之前。
非原子标量对象或位域 M 的值,由评估 B 确定,应为可见副作用 A 存储的值。
而且根据 C++ 标准,线程之间的“发生在”关系必须通过“与同步”或“是依赖顺序的”来建立before”,所以如果没有线程间同步,“happens before”关系就不会建立。
现在假设有两个线程 T1 和 T2,它们都由主线程启动,并且从不相互进行任何同步(因此不会在 T1 和 T2 之间建立任何“发生之前”关系T2)。如果 T1 写入一个非原子变量 M,那么根据上面的引用,T2 应该永远不会看到 M 被 T1 修改,因为没有“发生在”关系在 T1 和 T2 之间。
相反,T2 在 T2 启动时与主线程建立了“synchronizes with”关系,因此 T2 应该在主线程启动之前看到主线程设置的 M 的值线程,因为主线程和 T2 之间存在“发生之前”的关系。
对吗?但是我在我的机器上做了一个实验,但事实并非如此。怎么了?
【问题讨论】:
-
我不会发布答案,因为我担心它会被审查,但标准不会以任何方式形成或定义 MT 程序的行为。您需要的直觉是:对变量访问使用互斥。
标签: c++ c++11 language-lawyer lock-free stdatomic