有沒有一種方法可以在C++中設置,清除,測試和翻轉單個位作爲原子操作?例如按位變量來「compare_and_swap」。具有保證原子性的單位操作
1
A
回答
3
在整數中翻轉一點只是比較和交換操作。你用它來測試和翻轉一個位不會改變任何東西。所以一個簡單的compare_exchange_weak
循環會做到這一點。
3
原子操作位需要一個compare_exchange
RMW以避免觸及atomic
變量中的其他位。 測試一點不是一個修改操作,因此一個load()
就足夠了。
您必須添加範圍錯誤檢查
template<typename T, typename OP>
T manipulate_bit(std::atomic<T> &a, unsigned n, OP bit_op)
{
static_assert(std::is_integral<T>::value, "atomic type not integral");
T val = a.load();
while (!a.compare_exchange_weak(val, bit_op(val, n)));
return val;
}
auto set_bit = [](auto val, unsigned n) { return val | (1 << n); };
auto clr_bit = [](auto val, unsigned n) { return val & ~(1 << n); };
auto tgl_bit = [](auto val, unsigned n) { return val^(1 << n); };
int main()
{
std::atomic<int> a{0x2216};
manipulate_bit(a, 3, set_bit); // set bit 3
manipulate_bit(a, 7, tgl_bit); // toggle bit 7
manipulate_bit(a, 13, clr_bit); // clear bit 13
bool isset = (a.load() >> 5) & 1; // testing bit 5
}
相關問題
- 1. 嵌套的原子操作保證是原子嗎?
- 2. x86 128位原子操作
- 3. Winsocks上的原子性保證?
- 4. 80x86上的原子位域操作?
- 5. 有沒有一種方法可以確保C中的操作的原子性?
- 6. 揮發物的操作原子性
- 7. Spring AOP是否保證了原子性?
- 8. HBase如何保證行級原子性?
- 9. RabbitMQ彈出操作原子性
- 10. 如果在單個更新語句中執行,SQL中的操作是否保證爲原子操作?
- 11. File.Move原子操作
- 12. 非原子操作
- 13. DerbyJS原子操作
- 14. 原子操作 - C
- 15. 用揮發性原子變量原子操作
- 16. BigQuery爲查詢作業提供了什麼原子性保證?
- 17. 原子操作和原子交易
- 18. Redis中的原子操作
- 19. Riak的原子操作?
- 20. Django中的原子操作?
- 21. CUDA中的原子操作
- 22. ARM中的原子操作
- 23. window.localStorage上的原子操作
- 24. Sequelize中的原子操作
- 25. Erlang有向圖原子性和隔離保證
- 26. 什麼操作都是原子操作
- 27. 原子GETSET操作有哪些用例?
- 28. 原子操作中斷所有內核
- 29. 拉推原子操作?
- 30. CUDA原子操作列表
'的std :: atomic_bool'? – erip
沒有「C/C++」。選一個*。 –
你在使用什麼架構?如果給定的體系結構不支持位級原子操作,那麼語言/編譯器不會神奇地使它成爲可能。 –