内存障碍,不确定我是否可以轻松使用?
Memory barriers, unsure if I can use relaxed?
使用伪代码,我有两个线程都试图先到达并 "pop" 相同的数据:
线程 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
,您无法得到任何保证,只是不会出现数据竞争。它避免了未定义的行为,但它在少数情况下真正有用(例如,如果您可以通过其他方式保证同步)。
在你的例子中,你需要在线程之间同步,所以如果你使用宽松的语义,你仍然需要显式同步。否则,不能保证其他线程看到修改。
最后很可能不会更快,代码会更复杂。
使用伪代码,我有两个线程都试图先到达并 "pop" 相同的数据:
线程 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
,您无法得到任何保证,只是不会出现数据竞争。它避免了未定义的行为,但它在少数情况下真正有用(例如,如果您可以通过其他方式保证同步)。
在你的例子中,你需要在线程之间同步,所以如果你使用宽松的语义,你仍然需要显式同步。否则,不能保证其他线程看到修改。
最后很可能不会更快,代码会更复杂。