memory-model相关内容

线程同步:如何保证写操作的可见性

已经有很多关于软件和硬件内存模型、内存栅栏、存储/加载重新排序等的信息。然而,这些信息似乎都集中在确保对共享内存的读取和写入的相对顺序。 这样的系统将线程的写入完全延迟很长时间是否合法? 例如,假设一个线程对内存中的数据结构进行了一些更新,然后引发了一个应该将更新通知其他线程的标志: (dataWritten is initially false) store value1 st ..

使用 volatile 和 synchronized 时,内存刷新或发布到各个线程的范围是什么?

此问题仅涉及内存可见性,而不是发生在之前和之后.Java中有四种方法可以保证一个线程中对内存的更改对另一个线程可见.(参考 http://gee.cs.oswego.edu/dl/cpj/jmm.html) 写入线程释放同步锁,读取线程随后获取相同的同步锁. 如果一个字段被声明为易失性,写入它的任何值都会在写入线程执行任何进一步的内存操作之前被写入线程刷新并使其可见(即,为了手头的目的,它 ..
发布时间:2022-01-22 20:02:45 Java开发

C++0x 内存模型和推测加载/存储

所以我正在阅读作为即将到来的 C++0x 标准一部分的内存模型.但是,我对允许编译器执行的操作的一些限制感到有些困惑,特别是关于推测加载和存储的限制. 首先,一些相关的东西: Hans Boehm 关于线程和 C++0x 中的内存模型的页面 Boehm,“线程不能作为库实现" Boehm 和 Adve,“C++ 并发内存模型的基础" 萨特,“棱镜:原则-基于 Micr ..
发布时间:2021-12-28 23:03:31 C/C++开发

Java中的彼得森算法?

Java 中是否有用于互斥的 Peterson 算法的示例实现? 解决方案 这里没有人提供该算法在 Java 中的正确/安全实现.我不确定 John W 的解决方案应该如何工作,因为它缺少一些部分(即 ThreadLocals 的声明以及对他的数组中应该包含的内容的解释 - 原始 booleans 不有 get() 和 set()). Java 语言规范第 17 章 解释了 Java ..
发布时间:2021-12-28 22:54:44 Java开发

C++11 引入了标准化的内存模型.这是什么意思?它将如何影响 C++ 编程?

C++11 引入了标准化的内存模型,但这究竟是什么意思?它将如何影响 C++ 编程? 本文(作者:Gavin克拉克引用Herb Sutter) 说, 内存模型意味着C++代码现在有一个标准化的库可以调用不管是谁做的编译器以及它在什么平台上运行.有一个标准的方法来控制如何不同的线程与处理器的内存. "当你在谈论分裂时[代码] 跨不同内核在标准中,我们正在谈论内存模型.我们准备去优化 ..
发布时间:2021-12-06 11:15:56 C/C++开发

c++,std::atomic,std::memory_order 是什么以及如何使用它们?

谁能用简单的英语解释什么是std::memory_order,以及如何将它们与std::atomic一起使用? 我在这里找到了参考资料和几个例子,但根本不明白.http://en.cppreference.com/w/cpp/atomic/memory_order 解决方案 谁能用简单的英语解释一下 std::memory_order 是什么, 我为各种内存排序找到的最好的 ..
发布时间:2021-11-30 14:52:47 C/C++开发

每个 memory_order 是什么意思?

我读了一章,但不太喜欢.我仍然不清楚每个内存顺序之间的区别是什么.这是我目前的推测,在阅读了更简单的 http://en.cppreference.com/w/cpp/atomic/memory_order 以下内容有误,请勿学习 memory_order_relaxed:不同步,但在不同原子变量中从另一种模式完成订单时不会被忽略 memory_order_consume:同步读取这 ..
发布时间:2021-11-30 14:48:49 C/C++开发

现代 x86 硬件不能将单个字节存储到内存中吗?

谈到 C++ 的并发内存模型,Stroustrup 的 C++ 编程语言,,第 4 版,第 4 节.41.2.1,说: ...(像大多数现代硬件一样)机器无法加载或存储小于一个字的任何东西. 但是,我的 x86 处理器已经使用了几年,可以并且确实可以存储小于一个字的对象.例如: #include int main(){字符 a = 5;字符 b = 25;a = b;std::cou ..
发布时间:2021-11-30 11:12:21 C/C++开发

如何理解发生前一致

在 第 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)" 在我的理解中,它等于以下几个词:...,情况是既不 ... 也不 ... ..
发布时间:2021-11-25 16:41:02 Java开发

x86 架构的内存排序限制

Anthony Williams 在他的伟大著作《C++ 并发实践》中写道(第 309 页): 例如,在 x86 和 x86-64 架构上,原子加载操作是始终相同,无论是标记 memory_order_relaxed 还是 memory_order_seq_cst(见第 5.3.3 节).这意味着使用宽松的内存排序编写的代码可能在具有 x86 架构的系统上工作,在具有更好的系统上它会失败一组 ..
发布时间:2021-11-17 02:40:02 C/C++开发

x86:这里需要内存屏障吗?

在WB内存中,a = b = 0 P1:一 = 1围栏乙 = 1P2:当 (b == 0) {}LFENCE断言 (a == 0) 据我了解,这里不需要 SFENCE 或 LFENCE. 也就是说,对于这种内存类型,x86 确保: 读取不能与旧读取重新排序 商店不能与旧商店重新订购 商店可传递可见 解决方案 lfence 和 sfence asm 指令是无操作的,除非您 ..
发布时间:2021-09-29 19:38:56 其他开发

具有释放/获取语义的 volatile

从 Java 5 开始,volatile 关键字具有释放/获取语义,以使其他线程可以看到副作用(包括对 非 volatile 变量的赋值!).以这两个变量为例: int i;易失性 int v; 请注意,i 是一个常规的非易失性变量.想象线程 1 执行以下语句: i = 42;v = 0; 在稍后的某个时间点,线程 2 执行以下语句: int some_local_variable = ..
发布时间:2021-09-20 18:37:38 Java开发

为什么标准 C# 事件调用模式是线程安全的,没有内存屏障或缓存失效?类似的代码呢?

在 C# 中,这是以线程安全的方式调用事件的标准代码: var handler = 发生了什么事;如果(处理程序!= null)处理程序(这个,e); 编译器生成的 add 方法可能在另一个线程上使用 Delegate.Combine 创建一个新的多播委托实例,然后在编译器生成的字段上设置(使用互锁比较-交换). (注意:对于这个问题,我们不关心在事件订阅者中运行的代码.假设它是线程安全 ..
发布时间:2021-09-07 18:37:26 C#/.NET