C ++ 14は、std::mutex
がロックされているかどうかをチェックするメカニズムを省略しているようです。このSOの質問を参照してください。
https://stackoverflow.com/questions/21892934/how-to-assert-if-a-stdmutex-is-locked
これを回避するには、いくつかの方法があります。
std::mutex::try_lock()
std::unique_lock::owns_lock()
しかし、これらのどちらも特に満足のいく解決策ではありません。
try_lock()
現在のスレッドがミューテックスをロックしている場合、false negativeを返すことが許可され、未定義の動作があります。また、副作用もあります。オリジナルの上のowns_lock()
建設を必要とします。unique_lock
std::mutex
明らかに、自分でロールバックすることもできますが、現在のインターフェースの動機を理解したいです。
ミューテックスのステータスをチェックする機能(std::mutex::is_locked()
)は、私には難解な要求とは思えないので、標準委員会は見落としではなく意図的にこの機能を省略していると思います。
どうして?
編集:わかりましたので、多分このユースケースは私が期待していたほど一般的ではないので、特定のシナリオを説明します。複数のスレッドに分散された機械学習アルゴリズムがあります。各スレッドは非同期で動作し、最適化の問題が完了するとマスタープールに戻ります。
次に、マスターミューテックスをロックします。次に、スレッドは子孫を変異させる新しい親を選択する必要がありますが、現在他のスレッドによって最適化されている子孫を持たない親からのみ選択できます。したがって、現在別のスレッドによってロックされていない親を見つけるために検索を実行する必要があります。マスタースレッドミューテックスがロックされているため、検索中にミューテックスのステータスが変更されるリスクはありません。明らかに他の解決策もありますが(私は現在ブール値のフラグを使用しています)、mutexはスレッド間同期の目的で存在するこの問題に対する論理的な解決策を提供すると考えました。
is_locked
ますか?