草庐IT

c++ - 比较和交换 : synchronizing via different data sizes

使用GCC内置的C原子原语,我们可以使用__atomic_compare_exchange执行原子CAS操作。与C++11的std::atomic类型不同,GCCC原子原语在常规的非原子整数类型上运行,包括cmpxchg16b平台上的128位整数>支持。(C++标准的future版本可能支持与std::atomic_view类模板类似的功能。)这让我产生疑问:如果对较大数据大小的原子CAS操作观察到由对同一内存位置的原子操作发生的变化,但使用较小的数据大小会发生什么?例如,假设我们有:structuint128_type{uint64_tx;uint64_ty;}__attribute

c++ - 比较和交换 : synchronizing via different data sizes

使用GCC内置的C原子原语,我们可以使用__atomic_compare_exchange执行原子CAS操作。与C++11的std::atomic类型不同,GCCC原子原语在常规的非原子整数类型上运行,包括cmpxchg16b平台上的128位整数>支持。(C++标准的future版本可能支持与std::atomic_view类模板类似的功能。)这让我产生疑问:如果对较大数据大小的原子CAS操作观察到由对同一内存位置的原子操作发生的变化,但使用较小的数据大小会发生什么?例如,假设我们有:structuint128_type{uint64_tx;uint64_ty;}__attribute

c++ - 这个用于原子浮点的 C++ 实现安全吗?

Edit:Thecodeherestillhassomebugsinit,anditcoulddobetterintheperformancedepartment,butinsteadoftryingtofixthis,fortherecordItooktheproblemovertotheInteldiscussiongroupsandgotlotsofgreatfeedback,andifallgoeswellapolishedversionofAtomicfloatwillbeincludedinanearfuturereleaseofIntel'sThreadingBuildi

c++ - 这个用于原子浮点的 C++ 实现安全吗?

Edit:Thecodeherestillhassomebugsinit,anditcoulddobetterintheperformancedepartment,butinsteadoftryingtofixthis,fortherecordItooktheproblemovertotheInteldiscussiongroupsandgotlotsofgreatfeedback,andifallgoeswellapolishedversionofAtomicfloatwillbeincludedinanearfuturereleaseofIntel'sThreadingBuildi

c++ - 为什么 memory_order 作为 std::atomic 函数的运行时参数给出

std::atomic函数,例如store和load采用std::memory_order参数。参数可以在运行时确定,就像任何其他函数参数一样。但是,实际值可能会影响编译期间代码的优化。考虑以下几点:std::atomicai1,ai2;intvalue=whatever;voidfoo(){std::memory_ordermemOrd=getMemoryOrder();registerintv=value;//loadvaluefrommemoryai1.store(v,memOrd);//dependencyonv'svalueai2.store(1,memOrd);//node

c++ - 为什么 memory_order 作为 std::atomic 函数的运行时参数给出

std::atomic函数,例如store和load采用std::memory_order参数。参数可以在运行时确定,就像任何其他函数参数一样。但是,实际值可能会影响编译期间代码的优化。考虑以下几点:std::atomicai1,ai2;intvalue=whatever;voidfoo(){std::memory_ordermemOrd=getMemoryOrder();registerintv=value;//loadvaluefrommemoryai1.store(v,memOrd);//dependencyonv'svalueai2.store(1,memOrd);//node

c++ - 是否有必要使用 std::atomic 来表示线程已完成执行?

我想检查std::thread已完成执行。搜索stackoverflow我发现了以下question它解决了这个问题。接受的答案建议让工作线程在退出之前设置一个变量并让主线程检查这个变量。以下是此类解决方案的一个最小工作示例:#include#includevoidwork(bool*signal_finished){sleep(5);*signal_finished=true;}intmain(){boolthread_finished=false;std::threadworker(work,&thread_finished);while(!thread_finished){//d

c++ - 是否有必要使用 std::atomic 来表示线程已完成执行?

我想检查std::thread已完成执行。搜索stackoverflow我发现了以下question它解决了这个问题。接受的答案建议让工作线程在退出之前设置一个变量并让主线程检查这个变量。以下是此类解决方案的一个最小工作示例:#include#includevoidwork(bool*signal_finished){sleep(5);*signal_finished=true;}intmain(){boolthread_finished=false;std::threadworker(work,&thread_finished);while(!thread_finished){//d

c++ - 原子增量和返回计数器

尝试制作一个唯一的id生成函数,并想出了这个:std::atomicid{0};intcreate_id(){id++;returnid.load();}但我认为该函数有可能两次返回相同的值,对吧?例如,线程A调用函数,增加值,然后在线程B进来并增加值时停止,最后A和B都返回相同的值。因此使用互斥锁,函数可能如下所示:std::mutexmx;intid=0;intcreate_id(){std::lock_guardlock{mx};returnid++;}我的问题:是否可以仅使用原子来创建从计数器生成唯一int值的行为?我问的原因是因为我需要生成很多id,但是读到mutex很慢。

c++ - 原子增量和返回计数器

尝试制作一个唯一的id生成函数,并想出了这个:std::atomicid{0};intcreate_id(){id++;returnid.load();}但我认为该函数有可能两次返回相同的值,对吧?例如,线程A调用函数,增加值,然后在线程B进来并增加值时停止,最后A和B都返回相同的值。因此使用互斥锁,函数可能如下所示:std::mutexmx;intid=0;intcreate_id(){std::lock_guardlock{mx};returnid++;}我的问题:是否可以仅使用原子来创建从计数器生成唯一int值的行为?我问的原因是因为我需要生成很多id,但是读到mutex很慢。