gpt4 book ai didi

c++ - C++11 是否保证释放栅栏和消耗操作之间的内存顺序?

转载 作者:可可西里 更新时间:2023-11-01 16:20:47 28 4
gpt4 key购买 nike

考虑以下代码:

struct payload
{
std::atomic< int > value;
};

std::atomic< payload* > pointer( nullptr );

void thread_a()
{
payload* p = new payload();
p->value.store( 10, std::memory_order_relaxed );
std::atomic_thread_fence( std::memory_order_release );
pointer.store( p, std::memory_order_relaxed );
}

void thread_b()
{
payload* p = pointer.load( std::memory_order_consume );
if ( p )
{
printf( "%d\n", p->value.load( std::memory_order_relaxed ) );
}
}

C++ 是否对线程 a 中的栅栏与线程 b 中的消费操作的交互做出任何保证?

我知道在这个例子中我可以用商店发布替换栅栏+原子商店并让它工作。但我的问题是关于这个使用围栏的特殊情况。

阅读标准文本我可以找到有关释放栅栏与获取栅栏的交互以及释放栅栏与获取操作的交互的条款,但没有关于释放栅栏与消费操作的交互的条款。

我认为,用获取替换消耗会使代码符合标准。但据我了解处理器实现的内存排序约束,我应该只真正需要线程 b 中较弱的“消费”排序,因为内存屏障强制线程 a 中的所有存储在存储到指针之前可见,并且读取有效载荷取决于从指针读取。

标准是否一致?

最佳答案

您的代码有效。

I know that in this example case I can replace the fence + atomic store with a store-release and have it work. But my question is about this particular case using the fence.

具有宽松原子操作的栅栏比相应的原子操作更强。例如。 (来自http://en.cppreference.com/w/cpp/atomic/atomic_thread_fence,注释):

While an atomic store-release operation prevents all preceding writes from moving past the store-release, an atomic_thread_fence with memory_order_release ordering prevents all preceding writes from moving past all subsequent stores.

关于c++ - C++11 是否保证释放栅栏和消耗操作之间的内存顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30951672/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com