![]() |
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
|
![]() |
AstralHex · 矩阵乘法代码工作不正常 3 月前 |
![]() |
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 4 月前 |
![]() |
Die4Toast · 递归调用成员箭头运算符-> 4 月前 |
![]() |
Anka Hanım · 关于结构和动态数组地址的问题 4 月前 |