Linuxでインターロックされた同等物
-
02-07-2019 - |
質問
C ++ Linuxアプリで、 Win32のインターロックされた関数は提供しますか?具体的には、32ビットまたは64ビット整数をアトミックにインクリメントまたは追加する軽量な方法ですか?
解決 7
さらに検討すると、これ有望に見えます。 Yayスタックオーバーフロー。
他のヒント
Intelのオープンソース ThreadBuildingBlocks には、.NETのインターロッククラスと同じ機能を提供するAtomicテンプレートがあります。 。
gccのAtomicビルトインとは異なり、クロスプラットフォームであり、特定のコンパイラに依存しません。 Nemanja Trifunovicが上で正しく指摘しているように、提供された compare-and-swap のCPU命令に依存します。 x86およびItaniumチップ。 Intelライブラリには他に何も期待しないと思います:)
Linux とは関係のない問題を明確にするための注意事項はほとんどありません。
RWM (読み取り-変更-書き込み)操作およびシングルステップで実行されない操作は、原子的に実行するためにハードウェアサポートが必要です。それらの中で、インクリメントとデクリメント、fetch_and_addなど
一部のアーキテクチャ(I386、AMD_64、IA64を含む)では、gccにはアトミックメモリアクセスのサポートが組み込まれているため、外部ライブラリは必要ありません。 こちら APIに関する情報を読むことができます。
厳密に言えば、Linuxはアトミックな「インターロック」を提供できません。これらの機能はハードウェアサポートを必要とし、Linuxはそのサポートを提供しないプラットフォームで実行されるため、Win32のような機能です。とはいえ、Intel x86 / x64に制約される場合は、Boost共有ポインターライブラリの参照カウントの実装を見てください。
Apache Portable Runtimeのアトミック関数は本当に近いWin32 InterlockedXXX関数へ。
GTKおよびQTプログラミングおよびスタンドアロンで使用されるかなり一般的なglibライブラリは、さまざまなアトミック操作を提供します。 http://library.gnome.org/devel/glibを参照してください。 /2.16/glib-Atomic-Operations.html をご覧ください。 InterlockedがWin32でサポートする操作のほとんどに g_atomic
関数があり、ハードウェアがこれらを直接サポートするプラットフォームでは、必要なアセンブリコードとしてインライン化されます。