C++のアトミック操作として単一ビットを設定、クリア、テスト、フリップする方法はありますか?たとえば、 "compare_and_swap"のビット単位のバリアントです。アトミック性を保証したシングルビット操作
答えて
ビットを整数で反転することは比較と交換の操作に過ぎません。これを使って1ビットをテストして反転させても何も変わらないということです。したがって、単純なcompare_exchange_weak
ループがこれを行います。
を使用しているときは、期待される結果が分かっているものとみなされます。ビット操作ではそうではありません。 – chook
C/C++の「アトミック」は、中断されないという意味でのアトミック操作と同じではなく、スレッド・セーフティの一定レベルを保証するだけであることに注意してください。たとえば、stdatomic.hはISRによって割り込み可能なカーネルコードには適していません。 https://stackoverflow.com/questions/19900524/does-the-c-11-standard-guarantees-that-stdatomic-is-implemented-as-an-atom –
@chookを読むことはできません。期待される結果を決定する? – xaxxon
操作ビットは、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. ネストされたアトミック操作はアトミックであることが保証されていますか?
- 3. ARMのアトミック操作
- 4. CUDAのアトミック操作
- 5. PostgreSQL - トランザクションはアトミック性を保証しますか?
- 6. UnitOfWorkのパターンとアトミック操作
- 7. ネイティブAndroid、インターロック/アトミック操作
- 8. CUDAアトミック操作のリスト
- 9. Memcached - GET操作とSET操作はアトミックですか?
- 10. C++でのshared_ptrのアトミック操作11
- 11. Azureテーブル:100行以上のアトミック操作
- 12. gccは揮発性整数への整列したアクセスをアトミックにすることを保証しますか?
- 13. ファイルの操作順序の保証
- 14. はどのようにCAS命令を保証しアトミック
- 15. クリティカルセクション内のInterlockedExchange(または同様のアトミック操作)?
- 16. MongoDBにおける書き込み操作のアトミック性とは何ですか?
- 17. MongoDBの更新操作が成功したことを保証する
- 18. ユニオンを介したアトミックなアトミックなアクセス
- 19. ConcurrentLinkedQueueを非アトミック操作で使用する
- 20. アトミック操作のみを使用するC++/CLIのスレッド同期
- 21. MemoryCacheにアトミック操作を追加できますか?
- 22. アトミックな操作を実装する方法は?
- 23. アトミック性のネストされたトランザクション(Propogation.REQUIRED_NEW/Propogation.NESTED)
- 24. Gitのデータベース操作またはアトミック操作のACIDプロパティに使用されるアトミックな用語はなぜ、どのようにコミットされますか?
- 25. jiffiesがseq-lockで保護されているが、アトミック操作を直接使用しない理由
- 26. System.Collections.Concurrentオブジェクトに対して複数の操作をアトミックに実行しますか?
- 27. キュー内の循環グローバルバッファに対するアトミック操作
- 28. Redisの設定コマンドはアトミックな操作ですか?
- 29. atomic.hからの操作は非アトミックなようです
- 30. データブロック間でfsync()のアトミック性
'のstd :: atomic_bool'をチェックし、範囲エラーを追加する必要がありますか? – erip
"C/C++"はありません。一つを選ぶ*。 –
あなたはどのアーキテクチャを使用していますか?与えられたアーキテクチャがビットレベルのアトミック操作をサポートしていない場合、言語/コンパイラは魔法のようにそれを可能にしません。 –