使用伪代码,我有两个线程都试图首先到达并“弹出”相同的数据:

线程1

DataBlock db = memoryLocationX.reserveBlock();

线程2
DataBlock anotherDB = memoryLocationX.reserveBlock();

并且reserveBlock()在内存上执行std::exchange(),返回原始值并将其替换为空白值,因此只有一个线程可以获取数据:
DataBlock reserveBlock(){
    return DataBlock(_internalState.exchange(EMPTY_VALUE));
}

我的问题是,在什么情况下可以将std::memory_order_relaxed用作exchange()的第二个参数?我要确保的是,只有一个线程可以检索_internalState中存储的数据。但这已经通过exchange()实现了,所以这意味着我可以使用std::memory_order_relaxed吗?

最佳答案

使用std::memory_order_relaxed,您无法保证,不会有任何数据争用。它避免了未定义的行为,但是在少数情况下它真正有用(例如,如果您可以通过其他方式保证同步)。

在您的示例中,您需要在线程之间进行同步,因此,如果使用宽松的语义,则仍然仍然需要显式地进行同步。否则,不能保证其他线程可以看到修改。

最后,它很可能不会更快,并且代码将更加复杂。

10-07 19:52
查看更多