memory-barriers 相关问题

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

WakeByAddressAll的顺序如何?

这是问题std :: atomic :: notify_all的顺序如何?如果我直接使用WaitOnAddress或futex,该问题的答案是什么。从答案到……

回答 1 投票 0

std :: atomic :: notify_all的顺序如何?

我希望以下程序不会挂起。如果在(1)中以相反的顺序观察到(2)和(3),则它可能由于丢失通知而挂起:#include #include #include ]]]] 标准状态: 对原子对象M 的原子等待操作的调用通过M 上的原子通知操作的调用有资格被解除阻止,如果存在边影响X] >和M上的Y,使得: 观察X的结果后,原子等待操作已阻塞, X在Y之前以M的修改顺序,和 Y发生在原子通知操作的调用之前。 在您的示例中,go(M)的初始化对应于X,而store(2)的初始化对应于Y。初始化发生在调用等待之前,而存储发生在调用通知之前。所以不,您的程序无法挂起。

回答 1 投票 2

c ++ 11:具有互斥量的线程看到原子变量的值发生了变化,尽管这是唯一可以更改它的代码

一个原子变量(在这种情况下为128位结构)正在更新,这令唯一具有更新能力的线程感到惊讶。为何如此?这是一个最小的示例,所以它不起作用...

回答 2 投票 0

ARM上的无锁SPSC队列实现

我正在尝试为ARM写一个单一生产者单一使用者队列,我想我已经将DMB束之高阁,但需要进行一些检查(我对std :: atomic更为熟悉。) 'm ...

回答 1 投票 0

在用户和内核空间之间配对获取/释放操作

我正在尝试确保在用户线程和在Linux上以内核模式运行的另一个线程之间共享的一块内存上进行适当的同步。配对C11的...是否有意义?] >>

回答 1 投票 1

为什么在Linux内核的KCOV代码中有这个barrier()?

在KCOV代码中,为什么要设置此障碍? void notrace __sanitizer_cov_trace_pc(void){结构task_struct * t;枚举kcov_mode模式; t =当前; / * *我们对代码感兴趣...

回答 1 投票 1

我可以在std :: shared_mutex上使用std :: shared_lock更改数据吗?

我有多个与多个读取器/写入器线程共享的缓冲区,并且不同的写入器以不同的方式更改数据。例如,Writer1仅追加新数据,而Writer2 ...

回答 1 投票 0

X86线性化能力?

X86不提供开箱即用的顺序一致性(SC)。 X86提供TSO;因此它将免费提供以下障碍[LoadLoad] [LoadStore] [StoreStore]定期提供负载...

回答 1 投票 0

C11独立内存屏障LoadLoad StoreStore LoadStore StoreLoad

我想在原子操作和非原子操作之间使用独立的内存屏障(我认为无论如何都没有关系)。我想我了解存储障碍和负载障碍的含义,并且...

回答 1 投票 2

[放松内存排序时C ++延迟会增加

我在Windows 7 64位VS2013(x64发行版)上尝试内存排序。我想使用最快的同步共享对容器的访问。我选择了原子比较和交换。 ...

回答 1 投票 3

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

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

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