如果这个问题已经被回答了,或者如果我错过了一些显而易见的事情,那么请原谅。
我试图了解原子性的保证对于std::atomic的影响有多大。例如,如果我们有
std::atomic<int> a(0);
a.store(1);存储操作是原子的。但是,如果我们有嵌套的原子操作,会发生什么,例如:
std::atomic<int> a(0);
std::atomic<int> b(1);
a.store(++b);我的理解是,++b是原子的,store()也是原子的。我是否正确地假设这可以保证将2原子地存储在a中?
更重要的是,如果a和b在线程( T1 )和T2之间共享,那么是否可以保证两个线程执行的a.store(++b);将b的增量值(如各自的线程所看到的)原子地存储到每个线程中的a中?换句话说,在T2已经增加一次之后,在结果被T1存储到a之前,线程T1是否可以“插入”并再增加一次
发布于 2017-10-07 03:15:06
增量是原子的,存储是原子的,但是这两个操作一起不是。第一个线程可以增加b,得到挂起,然后另一个线程增加b并将该值存储在a中,然后第一个线程恢复并将b的(现在陈旧的)值存储到a中。
发布于 2017-10-07 03:23:50
原子性不构成。
假设没有其他人写到a和b,而另一个线程在它们存在后试图同时读取它们,并且它们读取了b,那么a,可能的读取就是:
{b,a}
{1,0}
{2,0}
{2,2}如果他们读a,那么b
{a,b}
{0,1}
{0,2}
{2,2}在本例中,这与b和a相同。
发布于 2017-10-07 03:24:13
a.store(++b);等于
int temp = ++b;
/* other threads can modify `b` but its value has been save in temp ... */
a.store(temp);https://stackoverflow.com/questions/46616272
复制相似问题