2009-06-01 7 views
12

time.h :: sleep()とpthread.h :: pthread_yield()の違いについての情報を探していましたが、確かな参考資料が見つからず、この質問を投稿しています。Pthread - time.h :: sleep()とpthread.h :: pthread_yield()の違いは何ですか?

time.h :: sleep()とpthread.h :: pthread_yield()の違いは何ですか?

更新:

I)は(個々のスレッドをスリープ状態に睡眠を()を使用していた...と私のアプリケーションは、8つのスレッド対4つのスレッドがあった時に問題を抱え始めたので、私が尋ねる理由があります。 sleep()が各スレッドにのみ影響するかどうかを調べるためにオンラインになったとき、Sleep()がプロセス全体に影響を与えるか、sleep()が個々のスレッドにしか影響しないかを示すよい参考文献は見つかりませんでした。

答えて

13

pthread_yieldサブルーチンは、そのプロセッサの使用を放棄し、それが再びスケジューリングされる前に、実行キューで待機し、呼び出し元のスレッドを強制します。 pthread_yieldサブルーチンが呼び出されたときに実行キューが空の場合、呼び出しスレッドは直ちに再スケジュールされます。 sleep manpageから

:seconds秒が経過するまで

睡眠は()呼び出し元プロセスの睡眠を作るか、信号を無視されていない到着しました。

スレッドにリアルタイムの遅延を持たせたくない場合は、他のスレッドが作業を実行できるようにしたい場合は、pthread_yieldがsleepよりも適しています。

+10

もっと正確に言うと、 'sleep()'は常にスレッドをカーネルの実行キューから削除し、スリープ時間が終わったらスレッドをrunqueueに戻すwaitqueueにタスクを追加します。一方、 'sched_yield()'はスレッドをアクティブな実行キューから期限切れの実行キューに移動するだけです。したがって、 'sleep(0)'も 'sched_yield'とは異なります(考えているように、何もしません)。 – Nikratio

12

sleep()は、プログラムの実行を一定時間停止させます。システム上で何が起こっても、少なくともsleep()に渡された時間が経過するまでスレッドは再開しません。 pthread_yield()は、スレッドが動作していることをオペレーティングシステムに通知し、実行を別のスレッドに切り替えることができるようにします。ただし、その時点で作業が必要な優先度の高いスレッドがない場合、スレッドはすぐに再開することがあります。他のスレッドが実行する必要がなくても、スレッドが実行を停止することが保証されています。pthread_yield()は、必要に応じて他のスレッドに実行の機会を与えるための礼儀正しい方法です。

質問の更新に対する更新:sleep()とpthread_yield()の両方が呼び出しスレッドにのみ影響します。

1

sleep(s)は、現在の実行スレッドを取り、S秒が経過するまで、それを一時停止(またはそれが信号によってウェイクアップされています。)

より実用的な面では、あなたが睡眠を()を呼び出したときに、そのスレッドが停止します実行し、ちょうど...指定された時間が経過するまで待ってください。渡すと、そのスレッドはレディキューに配置されます。

pthread_yield()は「このスレッドを取り出してレディキューに入れる」と述べています。スレッドは実行を停止し、スケジューラによって選択/実行されるために「待機」状態になります。これは、スレッドがすぐに実行を再開しないことを保証しません。しかし、それは別のスレッドに実行時のある時点で実行する機会を与えます。

私は手足に出て、sleep(0)がpthread_yield()と同じことを実行すると言います。実行を停止してスレッドを準備完了キューに入れます。 pthread_yieldから

+2

私はsleep(0)の場合、sleep()の少なくとも1つの実装が直ちに戻りますので、降伏には役に立ちません(これはglibcの古いバージョンでした) 。) –

関連する問題