gpt4 book ai didi

C++ 获取/释放排序

转载 作者:搜寻专家 更新时间:2023-10-31 01:46:01 25 4
gpt4 key购买 nike

假设我有 1 个从值 2 开始的计数器、一些非原子 bool 变量和 4 个线程。

//Initialization (happens before any thread execute).
std::atomic<int> count = ATOMIC_VAR_INIT(2);
bool someBoolean = false;

线程 1:

count.fetch_sub(1, std::memory_order_release);

线程 2:

someBoolean = true;
count.fetch_sub(1, std::memory_order_release);

线程 3:

while(count.load(std::memory_order_acquire) != 0);
//Now, we're out of the while loop...
assert(someBoolean);

线程 4:

while(std::atomic_thread_fence(std::memory_order_acquire), 
count.load(std::memory_order_relaxed) != 0);
//Now, we're out of the while loop...
assert(someBoolean);

线程 3 或线程 4 的断言是否有可能触发?

最佳答案

线程 4 可能会触发断言,因为您以错误的顺序使用了 load 操作和内存栅栏。您必须先加载 count 变量,然后放置内存获取栅栏。
在一般情况下,您必须在写入同步标志的之前放置一个释放栅栏,并在读取它的之后放置一个获取栅栏。

您可以在伟大的 Jeff Preshing 博客的这篇博文中找到获取/释放内存栅栏的详细解释和示例: http://preshing.com/20130922/acquire-and-release-fences/

线程 3(以及固定函数调用顺序后的线程 4)不会触发断言,因为线程之间的同步关系已正确建立。

关于C++ 获取/释放排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21261245/

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