memory-fences相关内容

对 pthread 互斥体所涉及的完整内存屏障的说明

我听说在处理互斥体时,必要的内存屏障由 pthread API 本身处理.我想了解有关此事的更多详细信息. 至少在最常见的架构上,这些说法是否属实? 编译器是否识别此隐式屏障,并在生成代码时避免重新排序操作/从本地寄存器读取? 什么时候应用内存屏障:成功获取互斥锁后和释放后? 解决方案 POSIX 规范列出了必须"与其他线程同步内存",包括pthread_mutex_lock() ..
发布时间:2022-01-22 20:36:00 其他开发

Java 8 不安全:xxxFence() 指令

在 Java 8 中,三个内存屏障指令被添加到 Unsafe 类(source): /*** 确保在栅栏前不会重新排序负载* 在栅栏后装载或储存.*/无效负载栅栏();/*** 确保在栅栏前不会对商店重新排序* 在栅栏后装载或储存.*/void storeFence();/*** 确保在栅栏前不会重新排序负载或存储* 在栅栏后装载或储存.*/void fullFence(); 如果我们用以下方 ..
发布时间:2021-12-28 23:02:09 Java开发

什么是内存栅栏?

使用显式内存栅栏是什么意思? 解决方案 为了提高性能,现代 CPU 通常无序执行指令,以最大限度地利用可用芯片(包括内存读/写).因为硬件强制执行指令完整性,所以在单个执行线程中您永远不会注意到这一点.但是,对于具有易失性内存(例如内存映射 I/O)的多线程或环境,这可能会导致不可预测的行为. 内存栅栏/屏障是一类指令,表示内存读/写按您预期的顺序发生.例如,“完整围栏"意味着围栏之 ..
发布时间:2021-12-28 22:37:38 其他开发

C# volatile 变量:内存栅栏 VS.缓存

所以我研究这个话题已经有一段时间了,我想我理解了最重要的概念,比如释放和获取内存栅栏. 但是,对于volatile和主存缓存的关系,我还没有找到令人满意的解释. 所以,我知道每次对 volatile 字段的读取和写入都强制执行严格的读取顺序以及在它之前和之后的写入操作(读取 - 获取和写入 - 释放)).但这只能保证操作的顺序.它没有说明这些更改对其他线程/处理器可见的时间.特别是,这 ..
发布时间:2021-12-20 11:16:35 C#/.NET

为什么(或不是?)SFENCE + LFENCE 等价于 MFENCE?

正如我们从之前对 在 x86/x86_64 处理器中指令 LFENCE 有意义吗?我们不能使用 SFENCE 代替 MFENCE 来实现顺序一致性. 那里的答案表明 MFENCE = SFENCE+LFENCE,即 LFENCE 做了一些我们没有的事情不能提供顺序一致性. LFENCE 无法重新排序: SFENCELFENCEMOV 注册,[地址] -- 至 --> MOV re ..
发布时间:2021-12-18 08:52:35 其他开发

jni/java:有效安全地不变本机对象的线程安全发布/共享

1)我有一个本地java函数,该函数传递几个参数,并且其实现是一个本地C ++构造函数,用于创建对象并返回从指针到对象的强制转换的long.该对象的构造成员实际上是不可变的.然后,C ++对象可以根据其构造状态进行工作. 2)获得函数调用结果的Java代码将指针的加长版本安全地发布到某个地方(没有互斥锁),并更改一个volatile变量,以希望将本机C ++对象中的内存更改发布到其他线程 ..

Dispatch_async()和类似方法是否提供内存隔离墙?

当我通过dispatch_async或类似方法在任何队列上运行一个块时,GCD是否在块调用周围提供线程防护?我以为可以,但是据我所知,文档没有给出任何一种提示. 解决方案 在Cocoa-Dev邮件列表中的电子邮件线程中,格雷格·帕克(Apple的运行时工程师) [S]因为使用GCD并没有给我们所有人带来灾难,所以我认为dispatch_async()等确实提供了此类内存障碍.同样,N ..
发布时间:2020-11-20 05:18:40 移动开发

C#易失性变量:内存隔离VS。快取

所以我现在已经研究了很长时间了,我认为我理解了最重要的概念,例如发布和获取内存保护区。 但是,对于 volatile 与主内存缓存之间的关系,我还没有找到令人满意的解释。 因此,我了解到每个对 volatile 字段的读写都对读取以及在读取之前和之后的写入操作进行严格的排序(读取获取和写入释放)。但这只能保证操作的顺序。它并没有说明其他线程/处理器这些更改可见的时间。特别是,这取决于刷 ..
发布时间:2020-09-28 05:18:43 C#/.NET

原子< bool> vs bool受互斥锁保护

我们假设我们有一个内存区域,某个线程正在向其中写入数据.然后,它将注意力转移到其他位置,并允许任意其他线程读取数据.但是,在某个时间点,它希望重用该存储区并再次写入该存储区. writer线程提供一个布尔标志(valid),该标志指示该内存仍可从中读取(即,他尚未重用它).在某个时候,他会将此标志设置为false,再也不会将其设置为true(它只会翻转一次,就是这样). 具有顺序一致性 ..
发布时间:2020-09-13 19:24:41 C/C++开发

原子递减是否比递增更昂贵?

在他的博客Herb Sutter 中写道 [...],因为增加了智能指针引用计数 通常可以优化为与普通增量相同 在优化的shared_ptr实现中-只是一条普通的增量指令, 并在生成的代码中没有栅栏. 但是,减量必须是原子减量或同等的量, 这会生成特殊的处理器内存指令,这些指令在 自己,最重要的是会引起记忆 限制优化周围代码的限制. 文本是关于shared_ptr的实现的,我不确 ..
发布时间:2020-09-13 19:23:49 C/C++开发

内存屏障是CPU执行的指令,还是仅仅是标记?

我试图确切地了解什么是内存障碍. 根据目前为止我所知道的,使用内存屏障(例如:mfence)来防止从内存屏障之前到之后以及之后到内存之前重新排序指令. 这是一个正在使用的内存屏障的示例: instruction 1 instruction 2 instruction 3 mfence instruction 4 instruction 5 instruction 6 现在我的问题是 ..

在OpenCL中,相对于barrier(),mem_fence()的作用是什么?

与barrier()(我想我理解)不同,mem_fence()不会影响工作组中的所有项目.对于mem_fence(): ,OpenCL规范说(第6.11.10节): 命令加载和存储执行内核的工作项. (因此它适用于单个工作项). 但是,与此同时,在第3.3.1节中,它表示: 在工作项内存中具有加载/存储一致性. 在一个工作项之内,内存是一致的. 那么mem_f ..
发布时间:2020-05-20 18:55:18 其他开发

关于pthread互斥锁所涉及的完整内存障碍的说明

我听说在处理互斥锁时,必需的内存屏障由pthread API本身处理.我想在这件事上有更多细节. 至少在周围最常见的架构上,这些说法是否正确? 编译器是否能够识别此隐式障碍,并避免在生成代码时对操作/从本地寄存器读取的操作进行重新排序? 何时应用内存屏障:成功获取互斥锁后并释放互斥锁? 解决方案 POSIX规范列出了必须在附录A.4.11 中,明确指出“同步内存"的功能: ..
发布时间:2020-05-14 02:13:49 其他开发

使用最终字段的成本

我们知道,使字段为final通常是一个好主意,因为我们获得了线程安全性和不变性,这使代码更易于推理.我很好奇是否存在相关的性能成本. Java内存模型可保证 final Field Semantics : 一个线程只能在完全初始化该对象之后才能看到对该对象的引用,这保证了该对象的最终字段可以看到正确初始化的值. 这意味着对于这样的课程 class X { X(int ..
发布时间:2020-05-13 22:45:27 Java开发

在thread :: join上是否存在具有与同步关系的隐式内存屏障?

我有一个正在工作的代码,它启动多个执行某些操作的线程,如果其中任何一个失败,则将共享变量设置为 false . 然后,主线程加入所有工作线程.对此的模拟大致如下(我注释掉了可能的修复程序,我不知道是否需要此修复程序): #include #include #include #include #include ..
发布时间:2020-05-13 21:59:01 C/C++开发

锁定的指令是否在弱顺序访问之间提供了障碍?

在x86上,lock前缀的指令(例如lock cmpxchg)除了提供原子操作外,还提供屏障语义:对于回写存储器区域上的常规存储器访问,读写操作不会在lock之间重新排序-prefixed指令,根据Intel SDM第3卷的8.2.2节: 无法使用I/O指令,锁定指令或序列化指令对读取或写入进行重新排序. 本节仅适用于回写存储器类型.在同一列表中,您会发现一个异常,其中指出弱排序的商店 ..
发布时间:2020-05-13 21:57:22 其他开发

如果我们将内存标记为WC(写组合),那么我们自动有任何一致性吗?

我们知道在x86架构上自动提供获取 - 发布一致性 - 即所有操作自动排序,没有任何栅栏,排除第一存储和下一个加载操作。 (如第34页的Herb Sutter所述: https ://onedrive.live.com/view.aspx?resid = 4E86B0CF20EF15AD!24884& app = WordPdf& authkey =!AMtj_EflYn2507c ) 如果 ..
发布时间:2016-12-26 19:43:40 其他开发