5

boost::interprocess::interprocess_mutex と boost::interprocess::interprocess_condition 変数を持つマネージド共有メモリ セグメントがあります。共有メモリにアクセスする 2 つのプロセスがあり、ミューテックスと条件に基づいてアクセスを同期しています。最初のプロセスが notify_all メソッドでブロックされるケースに遭遇しました。最初はこれは非ブロック メソッドだと思っていましたが、プロセス間条件がそれ自体を同期するために使用されるミューテックスを実装しているようです。

このデッドロックが発生するのは、条件の待機中にプロセス 2 が不当に強制終了された場合です。これにより、条件のミューテックスがロック解除されなくなり、プロセス 2 を再度実行するとブロックされます。プロセス2を2回目に開始したときにプロセス間条件をリセットまたはクリーンアップする方法はありますか.

4

1 に答える 1

0

http://www.boost.org/doc/libs/1_48_0/boost/interprocess/sync/interprocess_mutex.hpp

時限ロックを使用していますか?

単純なデッドロック回避アルゴリズムについては、こちらをご覧ください:ウィキペディア
スレッド用ですが、interprocess_locks で使用できると思います。

再帰的に、ロックを通過できるスレッドは 1 つだけです。他のスレッドがロックに入ると、通過した最初のスレッドが n 回完了するまで待機する必要があります。ただし、ロックに入るスレッドの数がロックされるスレッドの数と等しい場合は、1 つのスレッドをスーパースレッドとして割り当て、そのスレッドが完了するまで (ロックに入る/出る回数を追跡して) のみ実行できるようにします。スーパースレッドが終了すると、条件は再帰ロックからのロジックを使用するように戻り、スーパースレッドを終了します。

  • 自分自身をスーパースレッドではないと設定する

  • 他のロックされた待機中のスレッドがこの状態を再チェックする必要があることをロッカーに通知します

デッドロック シナリオが存在する場合は、新しいスーパー スレッドを設定し、そのロジックに従います。それ以外の場合は、通常のロックを再開します。

上記のアルゴリズムはライブロックの状況を解決しないことに注意してくださいそのような動作を防ぐには、semaphore可能であれば a を使用してください。

私は、interprocess_mutex がデッドロック回避アルゴリズムの実装を最近サポートしていないことに気付き、唖然とstd::mutexboost::mutexました。OS固有の制限だと思います。

柔軟性を高めるには、named_upgradable_mutexを使用してみてください

時限ロックを使用して、プロセスがクラッシュしたときに例外をキャッチし、アップグレード可能なミューテックスを削除してください。このタイプでは、昇格された特権をいずれかのスレッドで取得することもできます!

于 2013-08-14T20:09:08.827 に答える