3

私は Windows 用の C++ プロジェクトに取り組んでおり、b/w プロセス (つまり、winapi のラップ) を同期するための適切なミューテックス実装が必要です。私は現在boost::interprocess::named_mutexを使用していますが、プロセスの1つがクラッシュすると、ミューテックスは永久にロックされたままになることに気付きました(再起動後でも!)。この問題をグーグルで調べたところ、これが実際の動作であることが確認されました。

率直に言って、どのプロジェクトでもこの動作がどのように受け入れられるかわかりません。バグが存在し、プロセスがクラッシュします - これは、小さなバグが原因でシステムが二度と動作しなくなる可能性があることを意味します... 受け入れられません!

だから私の質問は:

  1. 「通常の」動作をする別の実装を推奨できる人はいますか (つまり、クラッシュ時にミューテックスが放棄され、システムの再起動後に「リセット」されて通常どおり動作する)。クロス プラットフォームの方が明らかに優れていますが、必須ではありません。

  2. 好奇心から-ブーストがこの動作を可能にするのはどうしてですか??

ありがとう!

4

3 に答える 3

4

boost::interprocessのドキュメントでは、さまざまなクラスの永続性について説明しています。named_mutex の場合、Kernel または Filesystem としてリストされます。このことから、Windows の実装ではファイルシステムが使用されていると推測できます。これが、システムを再起動した後もファイルシステムが保持される理由です。

状況によっては、プロセスごとに独自のファイルをディスクに書き込んで、プロセスが安全に終了した場合にそれを削除できる場合があります。ファイルが存在する場合にプロセスが再起動されると、クリーンでないシャットダウンがあったはずであり、boost::interprocess::named_mutex::remove static 関数を使用してミューテックスを削除できます。

于 2012-10-16T08:04:05.130 に答える
0

StlSoftのprocess_mutexを見てください。クロスプラットフォーム(OS固有のwinstlまたはunixstlバージョンではなく、platformstlコンポーネントを使用)およびヘッダーのみ。

于 2012-10-16T08:12:27.047 に答える