1

アトミック読み取りとインクリメント/デクリメントをサポートするハードウェアを使用している場合volatile sig_atomic_t、C ++ 03でを使用してアトミック操作にアクセスし、本格的なミューテックスを回避できますか、それともC ++ 11とを待つ必要がありstd::atomic<int>ますか?

4

1 に答える 1

5

一部のコンパイラは、それが機能することを可能にする非標準のセマンティクスを提供しますvolatileが、移植性はありません。 スレッド間通信ではなくvolatile、ハードウェアにアクセスするためのものです。あるスレッドによる変数への書き込みが別のスレッドに表示されるという保証はありません。スレッド間の通信には、型の操作によって提供されるメモリバリアなどの同期操作が必要です。volatilestd::atomic

詳細については、「volatilevs.volatile」およびHansBoehmのISOC ++ペーパー「揮発性は原子性とスレッド可視性セマンティクスを取得する必要がありますか?」を参照してください。(脚注から最近のハーブサッターのブログ投稿への両方のリンク)

ただし、コンパイラでC ++ 11のサポートを待つ必要はありませんが、ほとんどのプラットフォームは、GCCの__sync組み込み、Solarisのアトミック操作、Win32のインターロック関数など、必要なメモリバリアを含むプラットフォーム固有のアトミック操作を提供します。 。プラットフォーム固有の実装への共通インターフェイスを提供する、提案されたBoost.Atomicなどのポータブルライブラリもあります。

于 2012-10-11T00:16:58.313 に答える