pthread_mutex_trylock
がデッドロックを検出しブロックしない場合、なぜあなたも"need"pthread_mutex_lock
?`pthread_mutex_trylock`があるときに` pthread_mutex_lock`が必要なのはなぜですか?
おそらくスレッドを意図的にブロックしたい場合は、しかし、その場合、デッドロックが発生する可能性がありますか?
pthread_mutex_trylock
がデッドロックを検出しブロックしない場合、なぜあなたも"need"pthread_mutex_lock
?`pthread_mutex_trylock`があるときに` pthread_mutex_lock`が必要なのはなぜですか?
おそらくスレッドを意図的にブロックしたい場合は、しかし、その場合、デッドロックが発生する可能性がありますか?
おそらく意図的にスレッドをブロックしたいときは?
うん、まさにこの場合です。しかし、あなたはその
while(pthread_mutex_trylock(&mtx))
pthread_yield()
pthread_mutex_trylock
ようなものでpthread_mutex_lock()
動作を模倣することができますないは、デッドロックを検出します。
あなたは回避デッドロックにそれを使用することができますが、その周りにタイムアウトと、ループ内のpthread_mutex_trylock
を効果的に複数の呼び出し、後に自分のスレッドをすべて解放し、そのリソースを独自のコードをラップすることによってことをしなければなりません。
いずれの場合でも、すべてのスレッドが同じ順序でリソースを割り当てるという単純なルールに従えば、pthread_mutex_lock
でもデッドロックを回避できます。
リソースが利用できるようになるまで、効率的に待つだけでよく、ミューテックスを回転させることなく、しばしば非常に非効率的である場合は、pthread_mutex_lock
を使用します。適切に設計されたマルチスレッドアプリケーションでは、pthread_mutex_trylock
が必要ありません。
ロックは、作業を行うために最低限必要な時間だけ保持する必要があります。長すぎる場合は、一般にロック時間が短くなるように再設計することができます(ミューテックスを使用してスレッドのローカルデータ領域、およびミューテックスが解放された後で長時間実行されるビットを処理すること)。
擬似コード:それは時々非として提供されますけれども何pthread_yield()
は、POSIXスレッド(ではありませんので、
while not pthread_mutex_trylock:
yield
は特に、ロックが利用可能になるのを待っている、あなたのスレッドを実行し続けます - ポータブル拡張)。
つまり、最悪の場合、上記のコードセグメントは移植可能なCPUを生成することさえできないため、スケジューラサイクルのたびにその残りの部分を量子化します。
スケジューラサイクルごとにスレッドを1回アクティブにして、ミューテックスを取得できるかどうかを確認します。
に対し:ロックが使用可能になるまで、それは現在のロックホルダーリリースミューテックスまでの待機キューに移動しますので、
pthread_mutex_lock
は、最も可能性の高いは完全に、あなたのスレッドを一時停止します。
おそらく、pthread_mutex_lock
からpthread_mutex_trylock
の方が好ましい理由の主なものです。
'正しく設計されたマルチスレッドアプリケーションでは、pthread_mutex_trylockの変形が必要ありません。'これについて少し詳しく説明できますか?あなたが「適切に設計された」と話すとき、それはどういう意味ですか?適切な方法は何ですか?いずれか実際の例ですか? –
Anisha、私はミューテックスをポーリングすることはほとんど必要でないことを意味します。あなたがそれを得ることができなければ、あなたが望むことをすることはできません。ミューテックスが利用可能になるまでスレッド内で他の作業を行うことができるように人々は頻繁に投票しますが、そのような種類のスレッドはスレッドの全目的を破ります。あなたが待っている間に何か他のことが起こるようにしたいのであれば、それは他のスレッドのためのものです。ヨーダの言い方を変えると、 "スレッド、またはスレッドではありません。試行はありません" :-) – paxdiablo