web-dev-qa-db-ja.com

ベストプラクティスはポーリングではありません...しかし、スレッドがwait()を呼び出したときにポーリングが内部的に行われていませんか?

別のスレッドがタスクを終了したときにチェックしたいスレッドがあるとします。他のスレッドが終了したという通知を受け取るまでこのスレッドを待機させるwait()タイプの関数を呼び出す必要があることを読みました。これは、高額なポーリングを実行していないことを意味するので、これは良いことです。

しかし、ポーリングはとにかく内部的に下位レベルで行われていませんか?つまりスレッドをwait()にすると、カーネルがポーリングを実行して、最初のスレッドに通知できるように他のスレッドがいつ終了したかを確認しませんか?

私はここで何かを逃していると思いますが、誰かが私を啓発できますか?

13
csss

オペレーティングシステムは、ポーリングを必要としないこの種のプロセス間通信に特定のプリミティブを提供します。

プロセスAがミューテックスMで待機している場合、OSはAが実行できないことを認識し、何かが発生するのを待機しているプロセスのバケットにそれを確保します。 Mを保持しているプロセスが解放すると、OSはそれを待っているプロセスのリストを調べます。リストの最初のプロセス(おそらくA)は、アイドルバケットから削除され、実行キューに置かれます。次にAがタイムスライスを取得すると、Aが呼び出したwait()が戻り、プログラムが続行します。

28
Blrfl