|
|
1
3
在C++内存模型之前,C++内存模型比“概念”更容易“概念化”。在与PthPro交互的内存模型之前,C++被严格指定,并且对规范的合理解释允许编译器“引入”数据竞争,因此在旧的C++与PtLoG的上下文中,对MT算法的推理或证明是正确的(如果可能的话)是非常困难的。 在C++中,从来没有定义为原始步骤的顺序执行,这似乎有一个根本性的误解。表达式求值之间总是存在偏序的情况。编译器可以移动这些表达式,除非受到限制。记忆模型的引入并没有改变这一点。内存模型为不同执行线程之间的求值引入了偏序。
在数据竞赛上, POSIX says :
在数据竞赛上, C++ says
POSIX说pthread函数 与其他线程同步内存 作为这个松散规范问题的一个例子,编译器仍然可以引入或删除内存访问(例如通过寄存器提升和溢出),并进行比必要的更大的访问(例如,访问结构中的相邻字段)。因此,编译器可以完全正确地“引入”不是直接在源代码中编写的数据竞争。C++ 11内存模型阻止了它这样做。 C++ says, with regard to mutex lock
C++ says 解锁前的操作对新储物柜可见:
(对于B=unlock,C=lock,B只发生在C之前,因为B与C同步。Sequenced before是单个执行线程中的一个概念,因此,例如,一个完整表达式在下一个表达式之前进行排序。)
Foundations of the C++ Concurrency Memory Model
|
|
|
user107586 · 如何处理等待句柄不会导致无限循环? 1 年前 |
|
|
ron burgundy · 获取-释放语义是否跨线程传递?[副本] 1 年前 |
|
|
BenjiFB · C#内存缓存:在一次操作中追加到列表? 1 年前 |
|
|
András Takács · Python多线程问题 1 年前 |
|
|
András Takács · Python多线程错误 1 年前 |