草庐IT

c++ - 多线程程序中的 std::atomic<int> memory_order_relaxed VS volatile sig_atomic_t

volatilesig_atomic_t是否提供任何内存顺序保证?例如。如果我只需要加载/存储一个整数,可以使用吗?例如这里:volatilesig_atomic_tx=0;...voidf(){std::threadt([&]{x=1;});while(x!=1){/*waiting...*/}//done!}这是正确的代码吗?在某些情况下它可能不起作用?注意:这是一个过度简化的示例,即我不是在为给定的代码片段寻找更好的解决方案。我只想了解在根据C++标准的多线程程序中,我可以从volatilesig_atomic_t中得到什么样的行为。或者,如果是这种情况,请理解行为未定义的原因。

c++ - 我应该使用 atomic 还是 volatile 作为指针?

有两个线程(t1和t2)固定到两个不同的核心。它们都有一个共享变量,它是指向某个类类型的原始指针。t1只读指针,t2读/写指针。我应该将指针声明为volatile或atomic还是两者兼而有之?当t2更新这个指针时,t1读取旧指针或新指针都可以,但它不应该读取任何中间值,因为它会导致段错误。 最佳答案 volatile可用于告诉编译器不要优化对变量使用的内存的重复访问。显然,如果另一个线程可以更新变量,您将需要它。它被称为“几乎无用”的原因是,在太多情况下,这不足以保证正确的多线程行为,您需要查看内存栅栏和原子原语操作。在某些处理器

c++ - mac OS X 上的原子增量

我在MacOSX上搜索了原子递增和递减运算符并找到了“OSAtomic.h”,但您似乎只能在内核空间中使用它。JeremyFriesner向我指出跨平台atomiccounter他们在OSX上使用汇编或互斥(据我了解ifdef的交错)。在OSX上没有类似InterlockedDecrement或atomic_dec()的东西吗? 最佳答案 是什么让您认为OSAtomic只是内核空间?以下编译并工作正常。#include#includeintmain(intargc,char**argv){int32_tfoo=1;OSAtomicD

c++ - 对原子类 : memory_order_relaxed 感到困惑

我正在研究这个网站:https://gcc.gnu.org/wiki/Atomic/GCCMM/AtomicSync,这对理解关于原子类的话题非常有帮助。但是这个放松模式的例子很难理解:/*Thread1:*/y.store(20,memory_order_relaxed)x.store(10,memory_order_relaxed)/*Thread2*/if(x.load(memory_order_relaxed)==10){assert(y.load(memory_order_relaxed)==20)/*assertA*/y.store(10,memory_order_rela

c++ - 将 std::atomic_flag 包装在 getter/setter 中是否会使它的 "atomicity"无效?

假设我有一个包含std::atomic_flag作为私有(private)成员的类,通过getter公开。类似于以下内容(伪代码):classThing{private:std::atomic_flagready=ATOMIC_FLAG_INIT;public:isReady(){returnready.test_and_set();}}我天真的问题是:通过方法查询标志是否会将其变成非原子操作,成为非原子函数调用(或者是?)?我是否应该让我的ready标记为公共(public)成员并直接查询它? 最佳答案 不,它没有。test_an

c++ - 多核CPU上32bit读的原子性

(注意:我根据我认为可能会提供帮助的人的位置为这个问题添加了标签,所以请不要大声喊叫:))在我的VS201764位项目中,我有一个32位长值m_lClosed。当我想更新它时,我使用了Interlocked函数系列之一。考虑这段代码,在线程#1上执行LONGlRet=InterlockedCompareExchange(&m_lClosed,1,0);//Setm_lClosedto1providedit'scurrently0现在考虑这段代码,在线程#2上执行:if(m_lClosed)//Dosomething我知道在单个CPU上,这不会成为问题,因为更新是原子的,读取也是原子的(

c++ - std::atomic 加载方法在与 std::shared_ptr 一起使用时减少引用计数

我想使用std::atomic在我的代码中,以便可以自动更新shared_ptr,但是在访问shared_ptr时我遇到了问题。atomic上的load()方法似乎减少了shared_ptr上的引用计数,因此我无法在不释放对象的情况下实际使用该对象。这是显示问题的一段简化代码...typedefshared_ptrMyClassPtr;typedefatomicMyClassAtomicPtr;//1.MyClassPtrptr(newMyClass());printf("1.use_count=%d\n",ptr.use_count());//2.MyClassAtomicPtrat

C++11增加原子变量,赋值给其他值,是原子操作吗?

我对c++11上的原子操作感到困惑,我知道原子变量自增是原子操作,但我使用赋值给其他值,只是怀疑它。代码就像://....staticstd::atomici;//globalvariable//....//inthethreadintid=++i;在不同线程使用赋值时,id值是否唯一?测试代码:#include#include#include#includeclassA{public:staticintidGenerator;staticstd::mutexm;A(){//iknowthisoperationwillkeeptheid_isuniquestd::lock_guardl

c++ - 错误 C2280 : attempting to reference a deleted function (atomic<int>)

我有一个classA带有成员变量_atomicVar类型std::atomic.#includeclassA{public:A();~A();private:std::atomic_atomicVar;};如果我构建项目,我会收到以下错误:errorC2280:'std::atomic::atomic(conststd::atomic&)':attemptingtoreferenceadeletedfunction我主要是一名C#开发人员,所以我还不了解C++的每个细节(还)。我不知道我在哪里使用atomic的复制代码.我还尝试初始化_atomicVar:std::atomic_ato

c++ - 这个函数是原子线程安全的吗

我正在尝试学习如何使用atomic:)classfoo{staticstd::atomiccount_;uint32increase_and_get(){uint32t=count_++;returnt;}}函数increase_and_get()是线程安全的吗? 最佳答案 是的,它是安全的:增量是原子的,并且本地t不能被并发线程更改。您可以进一步简化代码以完全消除临时变量:uint32increase_and_get(){returncount_++;} 关于c++-这个函数是原子线程