首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套原子操作是否保证是原子操作?

嵌套原子操作是否保证是原子操作?
EN

Stack Overflow用户
提问于 2017-10-07 03:06:04
回答 3查看 229关注 0票数 0

如果这个问题已经被回答了,或者如果我错过了一些显而易见的事情,那么请原谅。

我试图了解原子性的保证对于std::atomic的影响有多大。例如,如果我们有

代码语言:javascript
复制
std::atomic<int> a(0);
a.store(1);

存储操作是原子的。但是,如果我们有嵌套的原子操作,会发生什么,例如:

代码语言:javascript
复制
std::atomic<int> a(0);
std::atomic<int> b(1);
a.store(++b);

我的理解是,++b是原子的,store()也是原子的。我是否正确地假设这可以保证将2原子地存储在a中?

更重要的是,如果ab在线程( T1 )和T2之间共享,那么是否可以保证两个线程执行的a.store(++b);b的增量值(如各自的线程所看到的)原子地存储到每个线程中的a中?换句话说,在T2已经增加一次之后,在结果被T1存储到a之前,线程T1是否可以“插入”并再增加一次

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-10-07 03:15:06

增量是原子的,存储是原子的,但是这两个操作一起不是。第一个线程可以增加b,得到挂起,然后另一个线程增加b并将该值存储在a中,然后第一个线程恢复并将b的(现在陈旧的)值存储到a中。

票数 2
EN

Stack Overflow用户

发布于 2017-10-07 03:23:50

原子性不构成。

假设没有其他人写到ab,而另一个线程在它们存在后试图同时读取它们,并且它们读取了b,那么a,可能的读取就是:

代码语言:javascript
复制
{b,a}
{1,0}
{2,0}
{2,2}

如果他们读a,那么b

代码语言:javascript
复制
{a,b}
{0,1}
{0,2}
{2,2}

在本例中,这与ba相同。

票数 1
EN

Stack Overflow用户

发布于 2017-10-07 03:24:13

代码语言:javascript
复制
a.store(++b);

等于

代码语言:javascript
复制
int temp = ++b;
/* other threads can modify `b` but its value has been save in temp ... */
a.store(temp);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46616272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档