- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的代码:
std::atomic<int> x(22) , y(22);
int temp_x = -1, temp_y = -1;
void task_0(){
x.store(33, std::memory_order_relaxed);
temp_y = y.load(std::memory_order_relaxed);
}
void task_1(){
y.store(33, std::memory_order_relaxed);
temp_x = x.load(std::memory_order_relaxed);
}
int main(){
std::thread t1(task_0);
std::thread t2(task_1);
t1.join();
t2.join();
std::cout<<temp_x<<" : "<<temp_y<<"\n";
return 0;
}
问题是,因为我使用“memory_order_relaxed”,所以在测试了100次输出后,
"33 : 33"
"22 : 33"
"33 : 22"
但它没有给出“22:22”输出
最佳答案
仅仅因为该标准说某种特殊的可能性是可能的,并不意味着导致其发生的原因是由随机数控制的。在实际计算机上,未指定行为的结果由这些实际计算机上操作码,高速缓存等的执行控制。
因此,尽管理论上有可能取得结果,但这并不意味着一定会发生。在您的特定情况下,要从这两者中获得22,则编译器(或CPU)基本上必须重新排序这两个函数中的至少一个。如果从这种重新排序中没有任何收获,那么它可能不会发生。
关于c++ - 为什么 “memory_order_relaxed”在我的系统中被视为 “memory_order_seq_cst” [C++],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63388494/
C++ 支持原子线程栅栏,即保证使用 std::atomic<> 的线程属性的栅栏。操作,具有函数 atomic_thread_fence 。它需要一个内存顺序参数来调整栅栏的“强度”。 我知道,当并
有没有表格总结一下内存顺序的区别?比如每种内存顺序在什么情况下使用 此外,内存顺序和(data_cond和future)有什么区别? is it 1. memory order is for wait
如果使用单个原子变量和 std::memory_order_seq_cst,是否保证非原子操作不会被重新排序? 例如,如果我有 std::atomic quux = {false}; void foo
在多线程程序中,如果只有一个线程使用它,您是否从 memory_order_seq_cst 得到任何保证,即您不会从较弱的顺序中得到保证?示例: #include extern atomic_int
我对C11的阅读spec with regards to atomic operation ordering建议 memory_order_seq_cst适用于对特定原子对象的操作。 大多数情况下,描
我从以下位置获取了有关 std::memory_order_seq_cst 的示例: http://en.cppreference.com/w/cpp/atomic/memory_order #inc
完全/通用内存屏障是指相对于系统其他组件而言,屏障之前指定的所有LOAD和STORE操作似乎都发生在屏障之后指定的所有LOAD和STORE操作之前的情形。 根据cppreference,memory_
我已经阅读了 c++11 标准中关于内存排序的章节,但对规则感到困惑。根据C++11标准(ISO/IEC JTC1 SC22 WG21 N3690),29.3 3,据说: There shall be
引用以下代码 auto x = std::atomic{0}; auto y = std::atomic{0}; // thread 1 x.store(1, std::memory_order_re
引用以下代码 auto x = std::atomic{0}; auto y = std::atomic{0}; // thread 1 x.store(1, std::memory_order_re
存储是释放操作,加载是两者的获取操作。我知道 memory_order_seq_cst 是为了对所有操作施加额外的总排序,但我没有建立一个例子,如果所有 memory_order_seq_cst替换为
我的代码: std::atomic x(22) , y(22); int temp_x = -1, temp_y = -1; void task_0(){ x.store(33, std:
我正在玩 C++ Concurrency in Action 中的一个示例,它使用 std::memory_order_relaxed 从 5 个不同的线程读取和写入 3 个原子变量。示例程序如下:
我正在玩 C++ Concurrency in Action 中的一个示例,它使用 std::memory_order_relaxed 从 5 个不同的线程读取和写入 3 个原子变量。示例程序如下:
我创建了一个简单的测试来检查 std::memory_order_relaxed比 std::memory_order_seq_cst 快atomic 的值增量。然而,这两种情况的性能是相同的。 我的
使用基本的简化版本 seqlock , gcc 将非原子负载重新排序到原子 load(memory_order_seq_cst)使用 -O3 编译代码时.当使用其他优化级别编译或使用 clang 编译
Why does this `std::atomic_thread_fence` work的后续问题 由于虚拟互锁操作优于_mm_mfence,并且有很多方法可以实现它,哪个互锁操作以及应使用哪些数据
来自 c++11 29.3-p3: There shall be a single total order S on all memory_order_seq_cst operations, cons
我正在研究 Google 的灯丝作业系统。目前,我正在研究他们实现的 WorkStealingDequeue。您可以查看完整的源代码here .这个数据结构是基于这个work .在他们的 pop 和
作为Anthony Williams said : some_atomic.load(std::memory_order_acquire) does just drop through to a si
我是一名优秀的程序员,十分优秀!