使用伪代码,我有两个线程都试图首先到达并"弹出"相同的数据:
Thread1
DataBlock db = memoryLocationX.reserveBlock();
Thread2
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
,您不能保证不会出现数据争用。它避免了未定义的行为,但在少数情况下它是真正有用的(例如,如果你可以通过其他方式保证同步)。
最后,它很可能不会更快,代码会更复杂。