jjzjj

c++ - 如果大于则无锁增量

是否有人知道一种无锁方式来执行逻辑上等同于compare_and_swap_if_greater_than()的操作?我们有compare_and_swap(),它实际上是compare_and_swap_if_equal()。我现在最好的方法是使用自旋互斥锁,但我认为巧妙地使用历史变量、循环和compare_and_swap()可能可以避免这种情况。 最佳答案 这个怎么样:publicstaticvoidCompareAndSwapIfGreaterThan(refintlocation,intnewValue){while(tr

C++11 无锁自动更新 2 个变量

我想更新atomicX当一个线程找到一个新的最小值来改变它。当它确实设置了新的最小值时,我还想更改一个变量y,原子地。有没有办法在没有锁的情况下做到这一点?同时在多个线程上执行的线程函数示例:uint64_tx=atomicX;inty=g();for(intnewX=0;newX我可以这样使用锁:inty=g();for(uint64_tnewX=0;newX我也愿意接受任何更清晰的结构,或其他方式一起完成。我不喜欢我必须拥有相同的newX条件两次,否则我必须打破循环。 最佳答案 有一个相当简单且可能足够便携的解决方案,即使用指针

c++ - 无法将枚举类型创建为原子

#include#includeusingnamespacestd;typedefenumday{sun=0,mon,tue}day;intmain(){atomica(sun);cout上面的代码尝试创建一个原子类型的枚举变量。但是我收到以下错误。undefinedreferencetostd::atomic::operatorday()constatomic不支持枚举类型吗?或者我的语法有什么错误吗?我正在使用在32位ubuntu12.0.4机器上运行的g++编译器。谢谢。 最佳答案 我使用支持C++11和C++14的在线编译器

c++ - 使用 atomic<bool> 的简单自旋锁中的数据竞争

这个问题在这里已经有了答案:C++11ImplementationofSpinlockusingheader``(2个答案)关闭7年前。#include#include#include#include#include#includeusingnamespacestd;classspinlock{private:atomicflag;public:spinlock():flag(false){}voidlock(){booltemp=false;while(!flag.compare_exchange_weak(temp,true,std::memory_order_seq_cst)&&

c++ - 使用 clang 对 std::atomic 函数的调用不明确

我正在尝试使用clang编译我的代码,我之前使用的是g++。我在编译以下代码时遇到错误:#includetypedefvoid(*my_func)();intmain(intargc,char**argv){std::atomic_func;_func();return0;}错误是:a.cpp:23:3:error:calltoobjectoftype'std::atomic'isambiguous_func();^~~~~/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/atomic:304:7:

c++ - atomic<bool> 与受互斥锁保护的 bool

假设我们有一个内存区域,某个线程正在向其中写入数据。然后它将注意力转移到别处并允许任意其他线程读取数据。然而,在某个时间点,它想要重用该内存区域并再次写入。写入器线程提供了一个bool标志(valid),它表示内存仍然有效,可以从中读取(即他还没有重新使用它)。在某个时候,他会将此标志设置为false,并且再也不会将其设置为true(它只会翻转一次,就是这样)。在顺序一致性的情况下,编写者和读者分别使用这两个代码片段应该是正确的:...valid=false;...和...if(valid){}else{}...我们显然需要做一些事情来确保顺序一致性,即插入必要的获取和释放内存屏障。我

c++ - 列表初始化是否将原子初始化为零?

问题:是否std::atomica{};初始化a(归零)还是不?背景:通常,我希望Ta{};要么给出编译时错误,要么确保a已初始化并可以使用。要么是因为T是一种基础/类似POD的类型,关于聚合/零/值/列表初始化的语言规则导致所有内容都被初始化为零(我忘记了到底是什么)或者因为默认构造函数被调用,它“通常”带来对象进入可用状态。当然,需要(不仅允许)双重初始化的类存在,但似乎相当罕见——尤其是在标准库中。但是,std::atomic的构造函数的文档说1)Thedefaultconstructoristrivial:noinitializationtakesplaceotherthanz

c++ - C++中是否存在任何隐式内存障碍

在下面的代码中,是使用必要的原子来保证所有平台上的无竞争语义,还是使用promise.set_value/future.wait暗示某种隐式内存屏障,这将允许我依赖标志写入对外线程可见?std::atomic_boolflag{false};//voidrunInThreadPoolBlocking(Callablefunc){std::promiseprom;autofut=prom.get_future();enqueueToThreadPool([&](){func();prom.set_value();});fut.get();}一般来说,对于thread.join()或fut

c++ - 如果 volatile 是不必要的,为什么 std::atomic 方法提供 volatile 重载?

thisgoodanswer说:volatileiscompletelyunnecessarywhenusedwithstd::atomic.然而,std::atomic_fecth_sub提供重载函数:templateTatomic_fetch_sub(volatilestd::atomic*obj,typenamestd::atomic::difference_typearg)noexcept;我的问题是:如果volatile对于std::atomic来说完全没有必要,为什么C++标准要为它提供一个重载函数? 最佳答案 Ifvo

c++ - std::atomic_compare_exchange_* 等如何与任意指针一起使用?

InterlockedCompareExchange在Windows中,以及__sync_val_compare_and_swap在gcc中采用指针,因此我可以传入任何地址,例如指向这些函数的共享内存块。对于非x86架构,我可能必须确保内存对齐以确保正确性,对于x86(可能还有其他),我可能希望确保缓存行对齐以提高性能,尽管正确性应该不是问题(->x86LOCK前缀)。为了摆脱我的代码中一些平台相关的东西(WindowsVC++与GCC),我查看了C++11的atomic_compare_exchange_weak。和friend。但它们都对std::atomic*类型的变量起作用.有