2012-02-13 6 views

答えて

1

おそらく意図的にスレッドをブロックしたいときは?

うん、まさにこの場合です。しかし、あなたはその

while(pthread_mutex_trylock(&mtx)) 
    pthread_yield() 
5

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の方が好ましい理由の主なものです。

+0

'正しく設計されたマルチスレッドアプリケーションでは、pthread_mutex_trylockの変形が必要ありません。'これについて少し詳しく説明できますか?あなたが「適切に設計された」と話すとき、それはどういう意味ですか?適切な方法は何ですか?いずれか実際の例ですか? –

+2

Anisha、私はミューテックスをポーリングすることはほとんど必要でないことを意味します。あなたがそれを得ることができなければ、あなたが望むことをすることはできません。ミューテックスが利用可能になるまでスレッド内で他の作業を行うことができるように人々は頻繁に投票しますが、そのような種類のスレッドはスレッドの全目的を破ります。あなたが待っている間に何か他のことが起こるようにしたいのであれば、それは他のスレッドのためのものです。ヨーダの言い方を変えると、 "スレッド、またはスレッドではありません。試行はありません" :-) – paxdiablo

関連する問題