17

time.h :: sleep()とpthread.h :: pthread_yield()の違いに関する情報を探すのにかなり長い時間を費やしましたが、確かな参考資料が見つからなかったため、この質問を投稿しています。

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

アップデート:

私が尋ねる理由は、私がsleep()を使用して個々のスレッドをsleep()していたためです...そして、8つのスレッドと4つのスレッドがあるときに、アプリケーションで問題が発生し始めました。オンラインでsleep()が各スレッドにのみ影響するかどうかを確認したところ、Sleep()がプロセス全体に影響するのか、sleep()が個々のスレッドにのみ影響するのかを示す適切なリファレンスが見つかりませんでした。

4

3 に答える 3

16

pthread_yieldから:

pthread_yieldサブルーチンは、呼び出し元のスレッドにそのプロセッサーの使用を放棄させ、実行キューで待機してから再度スケジュールされます。pthread_yieldサブルーチンが呼び出されたときに実行キューが空の場合、呼び出し元のスレッドはすぐに再スケジュールされます。

スリープマンページから:

sleep()は、秒秒が経過するか、無視されないシグナルが到着するまで、呼び出しプロセスをスリープ状態にします。

スレッドでリアルタイムの遅延を発生させたくなく、他のスレッドに作業を許可したい場合は、スリープよりもpthread_yieldの方が適しています。

于 2009-06-01T22:50:45.197 に答える
15

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

IOW、sleep()の後、他の誰も実行する必要がない場合でも、スレッドは実行を停止することが保証されますが、pthread_yield()は、他のスレッドが必要な場合に実行する機会を与えるための丁寧な方法です。

質問の更新に応じて更新します。sleep()とpthread_yield()はどちらも、呼び出し元のスレッドにのみ影響します。

于 2009-06-01T22:07:58.310 に答える
1

sleep(s)は現在の実行スレッドを取得し、s秒が経過するまで(またはシグナルによってウェイクアップされるまで)一時停止します。

より実際的な用語では、sleep()を呼び出すと、そのスレッドは実行を停止し、指定された時間が経過するまで待機します。通過すると、そのスレッドはレディキューに入れられます。

pthread_yield()は、「このスレッドを取得して、準備完了キューに入れます」と言います。スレッドは実行を停止し、スケジューラーによって選択/実行される「待機中」の状態になります。これは、スレッドがすぐに実行を再開しないことを保証するものではありません。しかし、それは別のスレッドにその実行の特定の時点で実行する機会を与えます。

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

于 2009-06-01T22:08:58.247 に答える