memory-model相关内容
已经有很多关于软件和硬件内存模型、内存栅栏、存储/加载重新排序等的信息。然而,这些信息似乎都集中在确保对共享内存的读取和写入的相对顺序。 这样的系统将线程的写入完全延迟很长时间是否合法? 例如,假设一个线程对内存中的数据结构进行了一些更新,然后引发了一个应该将更新通知其他线程的标志: (dataWritten is initially false) store value1 st
..
此问题仅涉及内存可见性,而不是发生在之前和之后.Java中有四种方法可以保证一个线程中对内存的更改对另一个线程可见.(参考 http://gee.cs.oswego.edu/dl/cpj/jmm.html) 写入线程释放同步锁,读取线程随后获取相同的同步锁. 如果一个字段被声明为易失性,写入它的任何值都会在写入线程执行任何进一步的内存操作之前被写入线程刷新并使其可见(即,为了手头的目的,它
..
在 x86 架构上,存储到同一内存位置具有总顺序,例如,请参见此视频.C++11 内存模型有哪些保证? 更准确地说,在 -- 最初--std::atomicx{0};-- 主题 1 --x.store(1, std::memory_order_release);-- 主题 2 --x.store(2, std::memory_order_release);-- 主题 3 --int r1
..
所以我正在阅读作为即将到来的 C++0x 标准一部分的内存模型.但是,我对允许编译器执行的操作的一些限制感到有些困惑,特别是关于推测加载和存储的限制. 首先,一些相关的东西: Hans Boehm 关于线程和 C++0x 中的内存模型的页面 Boehm,“线程不能作为库实现" Boehm 和 Adve,“C++ 并发内存模型的基础" 萨特,“棱镜:原则-基于 Micr
..
Java 中是否有用于互斥的 Peterson 算法的示例实现? 解决方案 这里没有人提供该算法在 Java 中的正确/安全实现.我不确定 John W 的解决方案应该如何工作,因为它缺少一些部分(即 ThreadLocals 的声明以及对他的数组中应该包含的内容的解释 - 原始 booleans 不有 get() 和 set()). Java 语言规范第 17 章 解释了 Java
..
我正在阅读 Joe Duffy 的关于 Volatile 读写的帖子,以及及时性,我正在尝试了解帖子中最后一个代码示例: while (Interlocked.CompareExchange(ref m_state, 1, 0) != 0) ;m_state = 0;while (Interlocked.CompareExchange(ref m_state, 1, 0) != 0) ;m_st
..
C++11 引入了标准化的内存模型,但这究竟是什么意思?它将如何影响 C++ 编程? 本文(作者:Gavin克拉克引用Herb Sutter) 说, 内存模型意味着C++代码现在有一个标准化的库可以调用不管是谁做的编译器以及它在什么平台上运行.有一个标准的方法来控制如何不同的线程与处理器的内存. "当你在谈论分裂时[代码] 跨不同内核在标准中,我们正在谈论内存模型.我们准备去优化
..
类似于我的上一个问题,请考虑这段代码 -- 最初--std::atomicx{0};std::atomicy{0};-- 主题 1 --x.store(1, std::memory_order_release);-- 主题 2 --y.store(2, std::memory_order_release);-- 主题 3 --int r1 = x.load(std::memory_order_a
..
谁能用简单的英语解释什么是std::memory_order,以及如何将它们与std::atomic一起使用? 我在这里找到了参考资料和几个例子,但根本不明白.http://en.cppreference.com/w/cpp/atomic/memory_order 解决方案 谁能用简单的英语解释一下 std::memory_order 是什么, 我为各种内存排序找到的最好的
..
我读了一章,但不太喜欢.我仍然不清楚每个内存顺序之间的区别是什么.这是我目前的推测,在阅读了更简单的 http://en.cppreference.com/w/cpp/atomic/memory_order 以下内容有误,请勿学习 memory_order_relaxed:不同步,但在不同原子变量中从另一种模式完成订单时不会被忽略 memory_order_consume:同步读取这
..
谈到 C++ 的并发内存模型,Stroustrup 的 C++ 编程语言,,第 4 版,第 4 节.41.2.1,说: ...(像大多数现代硬件一样)机器无法加载或存储小于一个字的任何东西. 但是,我的 x86 处理器已经使用了几年,可以并且确实可以存储小于一个字的对象.例如: #include int main(){字符 a = 5;字符 b = 25;a = b;std::cou
..
在 第 17 章JLS,它引入了一个概念:happens-before 一致性. 如果对于 A 中的所有读取 r,其中 W(r) 是 r 看到的写入操作,则一组动作 A 是发生前一致的,如果 hb(r, W(r))或者在 A 中存在写 w 使得 wv = rv 和 hb(W(r), w) 和 hb(w, r)" 在我的理解中,它等于以下几个词:...,情况是既不 ... 也不 ...
..
对于在原子数据类型的对象上执行的存储(例如,std::atomic),GCC 生成: MOV 指令在 release-store (std::memory_order_release) 的情况下, XCHG 指令,用于sequential-consistent-store (std::memory_order_seq_cst). 当目标架构是 x86_64 时.但是,当是ARM64(
..
我不是 ARM 专家,但至少在某些 ARM 架构上不会对这些存储和加载进行重新排序吗? atomic原子变量;int nonAtomic_var;int nonAtomic_var2;空 foo(){atomic_var.store(111, memory_order_relaxed);atomic_var.store(222, memory_order_relaxed);}空栏(){nonA
..
Anthony Williams 在他的伟大著作《C++ 并发实践》中写道(第 309 页): 例如,在 x86 和 x86-64 架构上,原子加载操作是始终相同,无论是标记 memory_order_relaxed 还是 memory_order_seq_cst(见第 5.3.3 节).这意味着使用宽松的内存排序编写的代码可能在具有 x86 架构的系统上工作,在具有更好的系统上它会失败一组
..
对于在原子数据类型的对象上执行的存储(例如,std::atomic),GCC 生成: MOV 指令在 release-store (std::memory_order_release) 的情况下, XCHG 指令,用于sequential-consistent-store (std::memory_order_seq_cst). 当目标架构是 x86_64 时.但是,当是ARM64(
..
在WB内存中,a = b = 0 P1:一 = 1围栏乙 = 1P2:当 (b == 0) {}LFENCE断言 (a == 0) 据我了解,这里不需要 SFENCE 或 LFENCE. 也就是说,对于这种内存类型,x86 确保: 读取不能与旧读取重新排序 商店不能与旧商店重新订购 商店可传递可见 解决方案 lfence 和 sfence asm 指令是无操作的,除非您
..
让我们考虑以下 C++ 中的双线程并发程序: x,y 是全局变量,r1,r2 是线程本地的,store 和 load 到 int 是原子的.内存模型 = C++11 int x = 0, int y = 0r1 = x |r2 = yy = r1 |x = r2 允许编译器将其编译为: int x = 0, int y = 0r1 = x |r2 = 42y = r1 |x = r2|
..
从 Java 5 开始,volatile 关键字具有释放/获取语义,以使其他线程可以看到副作用(包括对 非 volatile 变量的赋值!).以这两个变量为例: int i;易失性 int v; 请注意,i 是一个常规的非易失性变量.想象线程 1 执行以下语句: i = 42;v = 0; 在稍后的某个时间点,线程 2 执行以下语句: int some_local_variable =
..
在 C# 中,这是以线程安全的方式调用事件的标准代码: var handler = 发生了什么事;如果(处理程序!= null)处理程序(这个,e); 编译器生成的 add 方法可能在另一个线程上使用 Delegate.Combine 创建一个新的多播委托实例,然后在编译器生成的字段上设置(使用互锁比较-交换). (注意:对于这个问题,我们不关心在事件订阅者中运行的代码.假设它是线程安全
..