【发布时间】:2018-04-11 15:25:40
【问题描述】:
一个类有以下成员,
std::atomic<int> clientId{0};
并在其成员函数中给出以下内容,
int currentId = ++clientId.load();
这里有竞争条件吗?我正在尝试做类似的事情来生成clientId。多个线程可以执行这部分代码。增加了 clientId 的线程是否可以在尝试 load() 并获取副本之前,另一个线程增加相同的值,从而导致竞争条件? 如果是,使用互斥锁进行保护是使用普通 int 并在互斥锁中获取副本的最佳方式吗?
请解释一下。
【问题讨论】:
-
std::atomic<>::load不返回引用,所以你只是增加一个临时的,这不是竞争条件,但我怀疑这是你想要的...... -
你可能只是想要
int currentId = ++clientId;。 -
把你的
clientId声明放在函数外面。把它放在一个函数中意味着每次都会创建一个新对象,违背了它的目的。回答您的问题,atomic的工作是防止出现竞争条件等。 -
@Jarod42 clientId 可以在处理到 currentId 之前由另一个线程再次递增吗?
标签: c++ multithreading c++11 c++14 atomic