2

std::timed_mutexが通常のミューテックスよりも優先されるのはどのような状況ですか?

私が考えることができる唯一のユースケースは、デッドロックを防ぐための (IMO ハック的な) 方法です。

他にどのような状況で が適しているでしょうstd::timed_mutexか?

4

2 に答える 2

3

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

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

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

時限待機の使用は、基本的な例では見られないものですが、複雑なアーキテクチャでは頻繁に遭遇します。ミューテックスを使用する場所の例は、一般に、クライアントが 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)

はい、このコードは次のように書き換えることができます。

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

   if(done) break
   else print(x)
}

しかし、前の例はスリープではない (つまり、mutex が使用可能になると停止する) ため、クリーンで応答性が高くなります。

Linuxには、Posix標準の一部ではない、ミューテックスで時間指定待機を行う追加機能があることに注意してください(pthread_mutex_timedlockただし、現在はposix仕様になっていると思います)。OS X と BSD の sysv セマフォも同様です。適切な場合にのみ使用するのに十分賢い場合は、持っていると便利なツールです。

于 2012-04-21T05:28:20.427 に答える
0

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

于 2012-04-21T13:52:37.560 に答える