草庐IT

c++ - memory_order_seq_cst 如何与非原子操作同步?

如果使用单个原子变量和std::memory_order_seq_cst,是否保证非原子操作不会被重新排序?例如,如果我有std::atomicquux={false};voidfoo(){bar();quux.store(true,std::memory_order_seq_cst);moo();}是bar()保证在调用store之后不会重新排序,并且moo()在调用之前不会重新排序store,只要我使用std::memory_order_seq_cst,至少从另一个线程的角度来看?或者,换句话说,如果从另一个线程运行,以下假设是否有效?if(quux.load(std::memor

c++ - std::atomic::compare_exchange 与两个 memory_order 参数一起使用的真实示例

您能否给出一个真实世界的例子,其中出于某种原因使用了std::atomic::compare_exchange的两个memory_order参数版本(因此一个memory_order参数版本是不够的)? 最佳答案 在许多情况下,compare_exchange上的第二个内存排序参数设置为memory_order_relaxed。在这些情况下,省略它通常并没有错,只是可能效率较低。这里是一个简单的无锁列表/堆栈示例,它需要compare_exchange_weak上的第二个不同的排序参数,以便避免数据竞争。调用push可以并发执行,但

c++ - 为什么 std atomic 将 5 插入堆栈

我想看看std::atomic是如何被翻译成汇编的。为此,我编写了以下代码,但有些地方我不明白。以下代码:intmain(void){std::atomica;a.fetch_add(0);return0;}由GCC编译为:1|pushrbp2|movrbp,rsp3|movDWORDPTR[rbp-4],04|movDWORDPTR[rbp-8],55|movedx,DWORDPTR[rbp-4]6|learax,[rbp-12]7|lockxaddDWORDPTR[rax],edx8|moveax,09|poprbp10|ret为什么GCC将“5”(第4行)压入堆栈?

C++ 内存模型 : do seq_cst loads synchronize with seq_cst stores?

在C++内存模型中,所有顺序一致的操作的所有加载和存储都有一个总顺序。我想知道这如何与具有其他内存顺序的操作交互,这些内存顺序在顺序一致的加载之前/之后排序。例如,考虑两个线程:std::atomica(0);std::atomicb(0);std::atomicc(0);////////////////ThreadT1////////////////Signalthatwe'vestartedrunning.a.store(1,std::memory_order_relaxed);//IfT2'sstoretoboccursbeforeourloadbelowinthetotal//

c++ - x86_64 和 ARM 上的原子 CAS 操作是否始终使用 std::memory_order_seq_cst?

作为AnthonyWilliamssaid:some_atomic.load(std::memory_order_acquire)doesjustdropthroughtoasimpleloadinstruction,andsome_atomic.store(std::memory_order_release)dropsthroughtoasimplestoreinstruction.众所周知,在x86上,操作load()和store()内存屏障memory_order_consume,memory_order_acquire,memory_order_release,memory_o

c++ - 通过引用返回一个 unique_ptr

所以我已经解决了这个问题,但如果我所做的是最佳实践,我需要你的意见。一个简单的类包含unique_ptrs的vector订购元素。我会解释成员变量null_unique以下。classorder_collection{typedefstd::unique_ptrord_ptr;typedefstd::vectorord_ptr_vec;ord_ptr_vecorders;ord_ptrnull_unique;public:...constord_ptr&find_order(std::string);....所以我需要这个类的用户来访问订单unique_ptr如果找到。但是我不会将对象

C++ memory_order_consume, kill_dependency, dependency-ordered-before, 同步

我正在阅读C++ConcurrencyinAction安东尼·威廉姆斯。目前我在他描述memory_order_consume的地方。在那block之后有:NowthatI’vecoveredthebasicsofthememoryorderings,it’stimetolookatthemorecomplexparts这让我有点害怕,因为我不完全理解几件事:dependency-ordered-before与synchronizes-with有何不同?他们都创建了先发生后发生的关系。确切的区别是什么?我对以下示例感到困惑:intglobal_data[]={…};std::atomi

c++ - 是否会在其他线程中始终以相同顺序看到对不同线程中不同位置的两次原子写操作?

与我的previous问题类似,请考虑以下代码--Initially--std::atomicx{0};std::atomicy{0};--Thread1--x.store(1,std::memory_order_release);--Thread2--y.store(2,std::memory_order_release);--Thread3--intr1=x.load(std::memory_order_acquire);//xfirstintr2=y.load(std::memory_order_acquire);--Thread4--intr3=y.load(std::memo

c++ - 如何在 C++ 运行时声明 n 阶指针

指针可以这样声明:inta=1,*b=&a,//1storderpointer**c=&b,//2ndorderpointer***d=&c,//3rdorderpointer****e=&d,//4thorderpointer*****f=&e,//5thorderpointer***n-stars***f;//n-thorderpointer在这里,我们需要在编译时知道指针在声明时的顺序。是否有可能声明一个指针,其顺序仅在运行时才知道?与这个问题相关的是,是否可以在运行时查询任意指针的顺序?intorder=GET_ORDER_OF_PTR(f)//returns5int/*ins

c++ - 为什么宏 __STL_FUNCTION_TMPL_PARTIAL_ORDER 应该将模板函数包含在 std_pair.h 中

今天在STL_pair.h中看到如下代码:#ifdef__STL_FUNCTION_TMPL_PARTIAL_ORDERtemplateinlinebooloperator!=(constpair&__x,constpair&__y){return!(__x==__y);}templateinlinebooloperator>(constpair&__x,constpair&__y){return__y我不认为模板函数与偏特化有任何关联的功能模板。我错了吗? 最佳答案 编译器如何处理函数调用在C++中调用函数模板经历了名称查找(标准