Python
Java
PHP
IOS
Android
Nodejs
JavaScript
Html5
Windows
Ubuntu
Linux
glGenerateMipmap 需要哪个内存屏障?
我已使用 GL ARB shader image load store 写入纹理的第一个 mipmap 级别 文档指出 在其他操作中使用该图像的内容之前 我需要调用 glMemoryBarrier 以便适当地刷新缓存 例如 在执行 glTe
OpenGL
GLSL
memorybarriers
mipmaps
在并发创建线程之前读取修改的变量是否安全?
pseudocode for illustration int g 0 void fn if g 1 std cout lt lt hello lt lt std endl else std cout lt lt world lt lt s
c
Multithreading
memorybarriers
stdthread
memorymodel
为什么需要内存屏障?
C 4 in a Nutshell 强烈推荐 使用以下代码来演示 MemoryBarrier 的概念 假设 A 和 B 在不同的线程上运行 class Foo int answer bool complete void A answer 1
c
Multithreading
threadsafety
sharedmemory
memorybarriers
SFENCE 是否会阻止存储缓冲区隐藏来自 MESI 的更改?
如果 Core 进行写入 但其 L1 中不存在缓存行 则它会写入存储缓冲区 另一个 Core 请求该缓存行 MESI 无法看到存储缓冲区更新并返回未修改的缓存行 存储缓冲区不久后被刷新 但第二个核心已经使用旧值 我不明白如何SFENCE解决
Multithreading
Assembly
x86
atomic
memorybarriers
为什么 Unsafe.fullFence() 不能确保我的示例中的可见性?
我正在尝试深入研究volatileJava 中的关键字和设置 2 测试环境 我相信它们都使用 x86 64 并使用热点 Java version 1 8 0 232 CPU AMD Ryzen 7 8Core Java version 1
Java
x86
volatile
jvmhotspot
memorybarriers
在 OoOE 处理器中,内存存储真的可以重新排序吗?
我们知道两条指令可以通过面向对象处理器 例如 有两个全局变量在不同线程之间共享 int data bool ready 作家线程产生data并打开一个标志ready允许读者使用该数据 data 6 ready true 现在 在 OoOE
c
cpuarchitecture
processor
memorybarriers
不能像 store 那样在 x86 上稍后加载时放松原子 fetch_add 重新排序吗?
这个程序有时会打印 00 但是如果我注释掉 a store 和 b store 并取消注释 a fetch add 和 b fetch add 它们会做完全相同的事情 即都设置 a 1 b 1 的值 我永远不会得到00 在 x86 64 I
c
Multithreading
cpuarchitecture
memorybarriers
stdatomic
SFENCE和LFENCE对相邻核心的缓存有什么影响?
From the speech Herb Sutter in the figure of the slides on page 2 这里显示了单独的缓存 L1S和存储缓冲区 SB 1 在 Intel x86 处理器中cache L1 和 S
caching
Assembly
x86
intel
memorybarriers
宽松的原子规则有什么(轻微)差异?
看到赫伯 萨特斯表现出色后talk about 原子武器 我有点困惑轻松原子例子 我随身携带了一个atomic in the C 内存模型 SC DRF 无数据竞争的顺序一致 在加载 读取时执行 获取 据我所知 对于负载 和存储 默认值是s
c
memorybarriers
memorymodel
stdatomic
relaxedatomics
锁助手的线程安全使用(关于内存屏障)
我所说的锁定助手指的是一次性对象 可以通过它来实现锁定using声明 例如 考虑一个典型的用法SyncLock班级来自乔恩 斯基特的 MiscUtil public class Example private readonly SyncLo
c
Multithreading
locking
memorybarriers
asio隐式链和数据同步
当我阅读asio源代码时 我很好奇asio是如何在线程之间同步数据的 甚至是隐式链的制作 这些是 asio 中的代码 io service 运行 mutex scoped lock lock mutex std size t n 0 for
threadsafety
boostasio
memorybarriers
在 x86/x86_64 处理器上使用 LFENCE 指令是否有意义?
我经常在互联网上发现LFENCE在 x86 处理器中没有任何意义 即它什么都不做 所以改为MFENCE我们可以绝对无痛地使用SFENCE 因为MFENCE SFENCE LFENCE SFENCE NOP SFENCE But if LFE
Assembly
x86
x8664
atomic
memorybarriers
如何理解读内存屏障和易失性
有些语言提供了volatile修饰符被描述为在读取支持变量的内存之前执行 读内存屏障 读内存屏障通常被描述为一种确保 CPU 在执行屏障之后请求的读取之前已执行屏障之前请求的读取的方法 然而 使用这个定义 似乎仍然可以读取过时的值 换句话说
Multithreading
volatile
memorybarriers
是否应该将内存栅栏与互斥获取交换循环(或队列获取加载循环)结合起来,还是应该避免?
假设重复获取操作 尝试加载或交换值 直到观察到的值是所需值 让我们来cppreference 原子标志示例作为起点 void f int n for int cnt 0 cnt lt 100 cnt while lock test and
arm
cpuarchitecture
microoptimization
memorybarriers
中断的易失性与内存屏障
Let x and y是主代码和中断代码之间共享的变量 我的想法volatile的一点是 它只是并且始终需要在主代码中使用的硬件变量和中断变量 每次使用x and y通过禁用中断来保证主代码中的原子性 Do x and y确实需要volat
c
interrupt
atomic
volatile
memorybarriers
加载/存储宽松原子变量和普通变量有什么区别?
正如我从测试用例中看到的 https godbolt org z K477q1 生成的程序集加载 存储原子宽松与普通变量相同 ldr和str 那么 宽松原子变量和普通变量有什么区别吗 区别在于正常的加载 存储不是保证是无泪的 而轻松的原子读
c
C11
atomic
memorybarriers
stdatomic
如果我不使用栅栏,一个核心需要多长时间才能看到另一个核心的写入?
我一直在尝试用谷歌搜索我的问题 但老实说我不知道 如何简洁地陈述这个问题 假设我在多核英特尔系统中有两个线程 这些线程在同一个 NUMA 节点上运行 假设线程 1 向 X 写入一次 然后偶尔向前读取它 进一步假设线程 2 连续读取 X 如果
x86
intel
cpuarchitecture
memorybarriers
lockless
x86 上哪个写屏障更好:lock+addl 或 xchgl?
Linux 内核使用lock addl 0 0 esp 作为写屏障 而 RE2 库使用xchgl 0 0作为写屏障 有什么区别 哪个更好 x86 也需要读屏障指令吗 RE2 将其读屏障函数定义为 x86 上的无操作 而 Linux 将其定义
Assembly
x86
memorybarriers
互斥锁和解锁函数如何防止 CPU 重新排序?
据我所知 函数调用充当编译器屏障 但不充当 CPU 屏障 This tutorial说如下 获取锁意味着获取语义 而释放锁 意味着释放语义 其间的所有内存操作都是 包含在一个漂亮的小屏障三明治内 防止任何 跨边界的不良内存重新排序 我假设上
c
Assembly
x86
mutex
memorybarriers
加载和存储是唯一需要重新排序的指令吗?
我读过很多关于内存排序的文章 它们都只说 CPU 重新排序加载和存储 CPU 我对 x86 CPU 特别感兴趣 是否只重新排序加载和存储 而不重新排序它拥有的其余指令 乱序执行保留了按程序顺序运行的错觉对于单线程 核心 这就像C C as
x86
cpuarchitecture
memorybarriers
«
1
2
3
4
»