std::timed_mutexは、通常のミューテックスよりも優先される状況はありますか?`std :: timed_mutex`の有効なユースケースは?
デッドロックを防止するための(IMOハッキリ)方法と考えることができる唯一の使用例です。
その他の状況ではstd::timed_mutex
を選択するのがよいでしょうか?
std::timed_mutexは、通常のミューテックスよりも優先される状況はありますか?`std :: timed_mutex`の有効なユースケースは?
デッドロックを防止するための(IMOハッキリ)方法と考えることができる唯一の使用例です。
その他の状況ではstd::timed_mutex
を選択するのがよいでしょうか?
これは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セマフォを実行します。あなたが適切なときにそれを使用するのに十分なほどスマートなのであれば、それは便利なツールです。
タイムアウトミューテックス待機の最適な使用例は、特定の時間内にのみ有効な操作であるため、リソース輻輳の場合には失敗するはずです。