C++ Linux アプリで、Win32のインターロック機能が提供する機能を取得する最も簡単な方法は何ですか? 具体的には、32 ビットまたは 64 ビットの整数をアトミックにインクリメントまたは追加する軽量な方法はありますか?
7 に答える
Linuxとは何の関係もない問題を明確にするためのほんの少しのメモ。
RWM(読み取り-変更-書き込み)操作およびシングルステップで実行されない操作は、アトミックに実行するためのハードウェアサポートが必要です。それらの中で、インクリメントとデクリメント、fetch_and_addなど。
一部のアーキテクチャ(I386、AMD_64、IA64を含む)では、gccにはアトミックメモリアクセスのサポートが組み込まれているため、外部のlibrayは必要ありません。ここでは、APIに関するいくつかの情報を読むことができます。
Intel のオープンソースThreadBuildingBlocksには、.NET の Interlocked クラスと同じ機能を提供するテンプレート Atomic があります。
gcc の Atomic ビルトインとは異なり、これはクロス プラットフォームであり、特定のコンパイラに依存しません。Nemanja Trifunovic が上で正しく指摘しているように、 x86 および Itanium チップが提供するコンペア アンド スワップCPU 命令に依存しています。Intel ライブラリには他に何も期待しないと思います :)
厳密に言えば、Linux は Win32 のようなアトミックな「インターロック」機能を提供できません。これらの機能にはハードウェア サポートが必要であり、Linux はそのサポートを提供しないプラットフォームで実行されるからです。そうは言っても、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
あり、ハードウェアがこれらを直接サポートするプラットフォームでは、必要なアセンブリ コードとしてインライン化されます。
さらに検討すると、これは有望に見えます。おいスタックオーバーフロー。