2012-04-21 4 views

答えて

3

これはWindowsでの一般的な設計方法で、WaitForSingleObjectまたはWaitForMultipleObjectsのいずれかにタイムアウト値を指定して、待機が失敗するまでの時間を指定します。

デッドロックを回避するために使用されていません(実際には役に立たない、悪いスレッドコードは悪いスレッドコードです)。

Windowsには、Windows Vistaがリリースされるまで、Posixの条件変数に相当するものはありませんでした。全く異なるマルチスレッドコーディングパラダイムが開発されました。これは、時間の存在の唯一の理由ではありませんミューテックス。

タイムドウェイトの使用は、基本的な例では見えませんが、複雑なアーキテクチャでは、頻繁に実行されます。 の例はですが、ミューテックスを使用するのは一般的に何らかの種類のプロデューサ - コンシューマアーキテクチャであり、クライアントは何かをx秒ごとに実行しなければならず、イベントの形で「割り込み」が発生する可能性があります。簡単な擬似コード例:つまり、いつでもミューテックス(

while(true){ 
    sleep(1 second) 
    wait(mutex) 
    done = globalDone 
    unlock(mutex) 

    if(done) break 
    else print(x) 
} 

をしかし、それは睡眠ではないとして、前の例では、よりクリーンで応答性の両方である:

//This code will run indefinitely, printing the value of 
//the variable x every 1 second until an interrupt is received 
while(timed_wait(end_mutex, 1 second) != success) 
    print(x) 

はい、次のようにこのコードを書き換えることができ利用可能になると、停止します)。

Linuxには、mutexのタイムアウト待ちを行うための追加機能があります(pthread_mutex_timedlock、しかし今はposix仕様になっていると思います)。したがって、OS XとBSDでsysvセマフォを実行します。あなたが適切なときにそれを使用するのに十分なほどスマートなのであれば、それは便利なツールです。

0

タイムアウトミューテックス待機の最適な使用例は、特定の時間内にのみ有効な操作であるため、リソース輻輳の場合には失敗するはずです。

関連する問題