草庐IT

c++ - 按需条件 std::atomic_thread_fence 获取的优缺点?

下面的代码显示了两种通过原子标志获取共享状态的方法。读取器线程调用poll1()或poll2()来检查写入器是否已发出标志。投票选项#1:boolpoll1(){return(flag.load(std::memory_order_acquire)==1);}投票选项#2:boolpoll2(){intsnapshot=flag.load(std::memory_order_relaxed);if(snapshot==1){std::atomic_thread_fence(std::memory_order_acquire);returntrue;}returnfalse;}请注意,选

c++ - 同时使用非原子和原子操作

我有一个线程池,每个线程都包含一个计数器(基本上是TLS)。主线程需要通过计算所有线程本地计数器的总和来频繁更新。大多数时候,每个线程都会递增自己的计数器,因此不需要同步。但是在主线程更新的时候,我当然需要某种同步。我想出了MSVS内在函数(_InterlockedXXX函数),它表现出了出色的性能(在我的测试中大约0.8秒)但是,它将我的代码限制在MSVC编译器和X86/AMD64平台上,但是是否有一种C++可移植的方法来做到这一点?我尝试将int类型更改为std::atomic对于柜台,使用std::memory_order_relaxed对于增量,但这个解决方案非常慢!(~4秒)

c++ - 为什么 Boost 原子使用中的多生产者队列是无等待的

BoostAtomic示例中的无等待多生产者队列:templateclasswaitfree_queue{public:structnode{Tdata;node*next;};voidpush(constT&data){node*n=newnode;n->data=data;node*stale_head=head_.load(boost::memory_order_relaxed);do{n->next=stale_head;}while(!head_.compare_exchange_weak(stale_head,n,boost::memory_order_release));

c++ - 终止工作线程的正确方法

您好,我正在尝试找出终止工作线程的最佳和平方式。我有以下代码:classtest{public:test(){}~test(){}std::atomicworker_done;inta;voidpr(){while(true){if(worker_done){break;}std::this_thread::sleep_for(std::chrono::milliseconds(500));printf("%d\n",a++);}}std::thread*m_acqThread;voidcontinuous(){m_acqThread=newstd::thread(&test::pr,

c++ - 将非原子加载到与原子变量相同的缓存行会导致原子变量失败吗?

在ARMv8CPU上给出类似的东西(尽管这也可能适用于许多其他CPU):classabcxzy{//Pragmaaligntocachelinetoensuretheyexistonsameline.unit32_tatomic_data;uint32_tdata;voidfoo(){volatileasm("ldrw0,[addressofdata]\n""#Dostuffwithdatainw0...""strw0,[addressofdata]\n""1:ldaxrw0,[addressofatomic_data]\n""addw1,w0,#0x1\n""stxrw2,w1,[a

c++ - C++中原子变量的线程安全初始化

考虑以下C++11代码,其中类B被实例化并由多个线程使用。因为B修改了一个共享vector,所以我必须在B的构造函数和成员函数foo中锁定对它的访问。为了初始化成员变量id,我使用了一个计数器,它是一个原子变量,因为我从多个线程访问它。structA{A(size_tid,std::stringconst&sig):id{id},signature{sig}{}private:size_tid;std::stringsignature;};namespaceN{std::atomiccounter{0};typedefstd::vectorAs;std::vectorsharedRes

c++ - 使用 QAtomicInt/QAtomicPointer 进行原子读取

如何在Qt4中在所有支持的架构上以原子方式读取QAtomicInt或QAtomicPointer的值?我不关心这里的内存顺序,我只是想确保如果另一个线程同时更改值,我不会读取部分旧的、部分新的值。在Qt4中,这些类只有int或T*的转换运算符。似乎有更新的代码(http://qt.gitorious.org/qt/qtbase/blobs/master/src/corelib/thread/qbasicatomic.h)区分非原子load()和原子loadAcquire()。C++11原子也有一个原子load()(http://en.cppreference.com/w/cpp/ato

c++ - 这个锁的内存屏障是否正确?

这是正确的吗?我是否正确地假设在std::atomic_flag上应用内存排序不为通用锁提供同步?#includeclassSpinlock{public:Spinlock():f(ATOMIC_FLAG_INIT){}voidlock(){while(f.test_and_set(std::memory_order_relaxed));std::atomic_thread_fence(std::memory_order_acquire);}voidunlock(){std::atomic_thread_fence(std::memory_order_release);f.clear(

C++ 原子 : would function call act as memory barrier?

我正在阅读这篇文章MemoryOrderingatCompileTime从中说:Infact,themajorityoffunctioncallsactascompilerbarriers,whethertheycontaintheirowncompilerbarrierornot.Thisexcludesinlinefunctions,functionsdeclaredwiththepureattribute,andcaseswherelink-timecodegenerationisused.Otherthanthosecases,acalltoanexternalfunction

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