スレッドの一時停止

多くのマルチスレッド アプリケーションでは、スレッドを終了せずに、「中断」するのは珍しいことではありません。たとえば、クライアント / サーバーアーキテクチャでは、主サービス スレッドが要求を見つけるために入力キューをポーリングする場合があります。要求が見つからない場合は、再度入力キューをポーリングする前に CPU を別のプロセスまたはスレッドに使用させます。これは、CBL_THREAD_YIELD を呼び出すことで簡単に行うことができます。CBL_THREAD_YIELD を呼び出すと、アプリケーションの別のスレッド (オペレーティング システムによっては、別プロセスの別のスレッド) に CPU を譲ります。

他に、スレッドが CPU の所有権を無期限に放棄し、何らかのイベントが確実に発生した場合のみに CPU を使用できます。CBL_THREAD_SUSPEND により、中断されたスレッドのスレッド ハンドルを使用して別のスレッドが CBL_THREAD_RESUME を呼び出すまで呼び出し元のスレッドを中断できます。スレッドは対象となるスレッドがそれ自身を中断する前に、CBL_THREAD_RESUME を 1 回以上呼び出せます。この場合には、CBL_THREAD_SUSPEND の呼び出しは呼び出し元のスレッドにすぐに戻り、CPU の所有権を放棄しません。この操作は、セマフォを数えるのに非常に似ています。作成者 / 使用者間の問題は、CBL_THREAD_SUSPEND と CBL_THREAD_RESUME ルーチンのみを使用すると解決します。

注意:
.NET Framework におけるマネージ アプリケーションについて、Microsoft は、次のようにするべきであるとしています。「System.Threading.Thread.Suspend および System.Threading.Thread.Resume メソッドをスレッドの活動の同期には使用しないでください。停止時にスレッドが実行中のコードを知る方法はありません。セキュリティ許可の評価中に、ロックをホールドすると同時にスレッドを停止した場合、System.AppDomain 内の他のスレッドがブロックされる可能性があります。クラス コンストラクターの実行中にスレッドを停止すると、そのクラスを使用しようとしている System.AppDomain の他のスレッドがブロックされます。 デッドロックは非常にたやすく発生する可能性があります。」

コンパイラ指令 WARNINGS(2) を使用して、停止や再開の使用中に警告を発することができます。