小编bre*_*r00的帖子

memory_order_consume 到底有什么作用?

来自链接: 加载/存储宽松原子变量和普通变量有什么区别?

这个回答给我留下了深刻的印象:

使用原子变量解决了这个问题——通过使用原子,即使内存顺序放宽,所有线程都可以保证读取最新的写入值。

今天,我阅读了以下链接:https : //preshing.com/20140709/the-purpose-of-memory_order_consume-in-cpp11/

atomic<int*> Guard(nullptr);
int Payload = 0;
Run Code Online (Sandbox Code Playgroud)

线程1:

  Payload = 42;
    Guard.store(&Payload, memory_order_release);
Run Code Online (Sandbox Code Playgroud)

线程2:

g = Guard.load(memory_order_consume);
if (g != nullptr)
    p = *g;
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

问题: 我了解到数据依赖会阻止相关指令被重新排序。但我认为这对于确保执行结果的正确性是显而易见的。comsume-release 语义是否存在并不重要。所以我想知道 comsum-release 真的可以。哦,也许它使用数据依赖性来防止指令重新排序,同时确保 Payload 的可见性

所以

如果我使 1.preventing 指令重新排序 2.确保 Payload 的非原子变量的可见性,是否有可能使用 memory_order_relaxed 获得相同的正确结果:

atomic<int*> Guard(nullptr);
volatile int Payload = 0;   // 1.Payload is volatile now

// 2.Payload.assign and Guard.store in order for data dependency
Payload = 42;               
Guard.store(&Payload, memory_order_release);

// 3.data Dependency …
Run Code Online (Sandbox Code Playgroud)

c++ cpu-architecture memory-model lock-free stdatomic

5
推荐指数
1
解决办法
391
查看次数

为什么并行std :: for_each返回void

我正在详细阅读C++ 17.下面是std :: for_each的描述,在本书中:

在for_each的串行版本中,在C++ 17之前可用的版本>您将获得一元函数作为算法的返回值.在并行版本中不可能返回这样的对象,因为调用的顺序>是不确定的.

我仍然明白,为什么并行std :: for_each不能返回仿函数f.虽然调用的顺序是不确定的,但并行for_each块以等待调用完成.当每个并行操作完成时,返回f似乎没问题.

c++ parallel-processing c++17

0
推荐指数
1
解决办法
73
查看次数