![]() |
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
|
![]() |
Eric · fgets_unlocked()用于多线程读取不同文件 3 年前 |
![]() |
RoyGNEU · 堆上的专用std::Vector是线程安全的吗? 3 年前 |
![]() |
JaiK · 在c中使用线程或队列写入文件# 7 年前 |
![]() |
Catalin Ghita · 如何以安全线程对象为值初始化哈希表? 7 年前 |
![]() |
Juan JuezSarmiento · C++删除对象,是否锁定? 7 年前 |
![]() |
Missa · 两个不同线程正在处理原子NSMutableArray 7 年前 |
|
user5682282 · 从其他线程读取值 7 年前 |