memory-barriers 相关问题

内存屏障是一种特殊的处理器指令,它对内存访问在多处理器或多核系统中的其他处理器/内核可见的顺序施加限制。

除了提供必要的保证外,硬件存储屏障是否还使原子操作的可见性更快?

TL; DR:在生产者-消费者队列中,是否有必要放置不必要的(从C ++内存模型的角度来看)内存围栏,或不必要的强内存顺序以在... ...上具有更好的延迟,这是否有意义? [

回答 1 投票 1

轻松的原子存储在发布之前是否已对其自身重新排序? (与加载/获取类似)

我在en.cppreference.com规范中阅读了对原子的轻松操作:“ [仅保证原子性和修改顺序的一致性。”所以,我问自己是否有这样的'修改...

回答 1 投票 0

当3个“存储”顺序发生并且只有一个原子时发生的事情

为了清楚起见,我试图将其简化为一个简单的示例。我有一个原子标记,用于指示一件事刚刚完成而另一件事尚未开始。两者...

回答 1 投票 2

在c ++中,我们可以通过volatile +内存栅栏(sfence + fence)保证两个线程之间发生事前吗?

简而言之,可以使用以下代码将src中存储的数据正确复制到dst吗? volatile bool标志= false; //在线程A中。memset(mid,src,size); __asm__ __volatile __(“ sfence” :::“ ...

回答 2 投票 1


std :: atomic std :: memory_order for std :: atomic :: wait 根据cppreference,在C ++ 20中,wait中有notify_one,notify_all,std::atomic<T>。看起来它们使std::atomic<T>可用作 futex 。 我问为什么wait接受std :: memory_order作为参数。由于我总是需要检查从等待唤醒是否不是虚假的,因此我将在相应的负载中指定内存顺序: std::atomic<bool> x; while (x.load(std::memory_order_acquire) == false) { x.wait(false, std::memory_order_acquire); } 还是我应该指定std::memory_order_relaxed等待?是否存在wait后面没有load的情况? 根据cppreference,在C ++ 20中,std :: atomic 中有等待,notify_one,notify_all。看起来它们使std :: atomic 可用作futex。我在问为什么要等待接受std :: ... 同一对象上的所有原子操作将始终具有单个顺序,并且其中包含单个线程内的顺序。也就是说,relaxed无法对同一线程内同一对象上的原子操作进行重新排序。 relaxed内存顺序是相对于该特定原子以外的其他内存操作的顺序。因此relaxed可以很好地检查等待本身,但是当您想实际读取原子值中包含[[is]]的释放线程写入的数据时,您将需要一个更强的内存顺序为了确保他们的知名度。因此,如果有必要,您的外循环应使用更合适的条件来获取可见性。 我为此提案将这个问题发布到GitHub,并让a response std :: atomic :: wait打算在带有逻辑的futex上实现,特别是为了掩盖虚假的唤醒。 所以,cppreference.com对此是错误的: 允许这些功能散乱地解除阻塞,即由于值更改或通知以外的原因而返回。 虽然在我的示例中循环是多余的,但我应该只使用: std::atomic<bool> x; x.wait(false, std::memory_order_acquire);

还是我应该指定std::memory_order_relaxed等待?是否存在wait后面没有load的情况?

回答 2 投票 2

缺少同步时的轻松原子和内存一致性

我已经编写了一个基本的图形调度程序,以无等待的方式同步任务执行。由于图拓扑是不可变的,因此我想让所有原子操作都放宽。但是,由于我...

回答 1 投票 2

C ++仅使用MOV如何在x86上实现释放和获取语义?

此问题是对此的跟进/澄清:MOV x86指令是否实现C ++ 11 memory_order_release原子存储?这表明MOV汇编指令足以...

回答 2 投票 6

C11原子获取/发布和x86_64缺乏加载/存储一致性?

我正在努力解决C11标准的5.1.2.4节,尤其是Release / Acquire的语义。我注意到https://preshing.com/20120913/acquire-and-release-semantics/(以及其他)...

回答 1 投票 9

为什么已经使用seq_cst CAS的无锁队列中需要atomic_thread_fence(memory_order_seq_cst)?

无锁队列,只有一个线程执行推入和弹出,其他线程执行窃取。但是,我不明白为什么secret()需要std :: atomic_thread_fence(std :: memory_order_seq_cst)。我认为,steal(...

回答 1 投票 2

如何在C ++ 11中实现StoreLoad障碍?

我想编写可移植的代码(Intel,ARM,PowerPC ...),它解决了经典问题的一个变体:最初:X = Y = 0线程A:X = 1 if(!Y){做某事}线程B:Y = 1 if(!X){做某事} ...

回答 1 投票 7

在访问静态初始化的变量时应该使用屏障吗?

在我的函数中,我有以下两行代码:static volatile uint64_t static_index = 0; const uint64_t index = __sync_fetch_and_add(&static_index,1,__ATOMIC_RELAXED);如您所见,...

回答 1 投票 2

使用标志在线程之间进行通信

[在互联网上,可以找到许多关于在并行编程中使用volatile关键字的争论,有时会引起矛盾的争论。关于此...的更值得信赖的讨论之一...

回答 4 投票 2


为什么Unsafe.fullFence()无法确保示例中的可见性?

我正在尝试深入探讨Java和设置2测试环境中的volatile关键字。我相信他们两个都使用x86_64并使用热点。 Java版本:1.8.0_232 CPU:AMD Ryzen 7 8Core Java ...

回答 1 投票 1


为什么`std :: atomic_thread_fence`工作

首先,我想列出我对此的一些理解,如果我错了,请纠正我。 x86中的MFENCE可以确保完整的屏障顺序一致性防止对STORE-STORE进行重新排序,...

回答 1 投票 2


为什么内存重排序在单核/处理器机器上不是问题?

请考虑以下示例,该示例取自Wikipedia,稍作改动,其中程序的步骤对应于各个处理器指令:x = 0; f = 0;线程#1:while(f == 0); ...

回答 1 投票 1

Java内存模型:单线程和多核CPU

在Java应用程序中,如果对对象状态的访问发生在同一线程上(在最简单的情况下,在单线程应用程序中,则无需进行同步以强制执行可见性/ ...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.