マルチスレッドのプログラミング

スケジューリングに関するデッドロック

ロックが獲得される順序が保証されていないため、特定のスレッドがロックを獲得できないという問題が発生します。

通常、この問題は次のような状況で起こります。スレッドが、保持していたロックを解除し、少し時間をおいてからもう一度ロックを獲得するものとします。このとき、ロックはいったん解除されたので、ほかのスレッドがロックを獲得したように見えます。しかし、ロックを保持していたスレッドはブロックされません。その結果、このスレッドは、ロックを解除してからロックを再度獲得する間も引き続き実行されます。この場合、ほかのスレッドは実行されません。

通常、この種の問題を解決するには、ロックを再度獲得する呼び出しの直前に sched_yield(3C)() を呼び出します。sched_yield() 関数は、その他のスレッドに実行とロックの獲得を許可します。

必要なタイムスライスの大きさはアプリケーションに依存するため、システムでは特に制限していません。sched_yield() を呼び出して、スレッドが共有する時間を設定してください。