Har*_*rry 2 multithreading c++11
我想知道是否可以使用单个原子操作执行原子变量的比较和增量。这是我到目前为止所写的(线程的片段代码)
std::atomic<int> counter; //global variable
if(counter<25)
{
counter++;
}
else
{
//send serial/socket data
}
Run Code Online (Sandbox Code Playgroud)
我知道我做错了,因为原子变量计数器被访问了两次(一次用于获取数据,另一次用于增量)。但是如果另一个线程在获取变量值之后和增量之前对“计数器”执行一些更新操作,这可能会导致问题。所以我想知道是否可以一次完成这两个操作。另外我不想使用互斥锁。
在if(counter<25) counter++;读取计数器和更新它之间存在竞争条件(即原子加载,然后是原子加载-修改-存储)。
它需要一个比较交换循环来确保读取的值没有改变。如果已更改,则需要重试该操作。
类似于以下内容:
std::atomic<int> counter;
auto value = counter.load(std::memory_order_relaxed);
while(value < 25) {
if(counter.compare_exchange_weak(value, value + 1, std::memory_order_release, std::memory_order_relaxed))
break; // Succeeded incrementing counter.
// compare_exchange_weak failed because counter has changed.
// compare_exchange_weak reloaded value with the new value of counter.
// Retry.
}
if(!(value < 25))
// Failed to increment because counter is not less than 25.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3097 次 |
| 最近记录: |