インターロックされた変数アクセスとクリティカルセクションのインターロックされたインクリメントの違いをc ++で説明できる人はいますか? よろしくお願いします。
3 に答える
基本的に、これらのInterlockedXXX
関数は多かれ少なかれ組み込み関数であり、比較的少数 (通常は 1 つ) のアセンブリ命令にマップされます。このような操作は中断できないため、アトミックであると言われます (アトミック性は、少なくともターゲット プラットフォームで可能であれば、CPU レベルで達成されます)。
ACRITICAL_SECTION
は、より長いセクションを保護できる同期プリミティブです。これは実際にロックを行い、競合するスレッドは、スレッドがクリティカル セクションの所有権を解放するまで待機することを余儀なくされます。
クリティカル セクションは OS のプリミティブですが、1 つのプロセスに限定されます。Windows でのクリティカル セクションの兄貴分は で、Mutex
プロセス間の同期に使用できます。
可能であれば関数を使用してくださいInterlockedXXX
(たとえば、1 つのカウンターを保護するために完全なクリティカル セクション オブジェクトを使用しても意味がありません)。さまざまなプロトタイプとその使用方法を事前に確認しておくことをお勧めします。多くの人がクリティカル セクションを使用InterlockedCompareExchange
します。
基本的に、インターロック機能はクリティカル セクションと同じ概念ですが、特定の操作 (ロック、操作、ロック解除) のためにハードウェアに実装されています。これにより、はるかに高速になりますが、適用性が制限されます。クリティカル セクションはより汎用的ですが、使用する相対的なコストは高くなります。また、競合状態やデッドロックなどの問題もあります。
クリティカル セクションはロックです。InterlockedXxx
関数呼び出しはアトミック操作であり、ロックはありません。どちらか一方を他方の観点から構築することもできますが、実際には、それらのパフォーマンス特性は大きく異なります (通常、インターロック機能の方が高速です)。