2

IPC に boost::shared_memory_object を使用しています。クライアントとサーバーがあります。2 つのメッセージ キューを使用します。1 つはサーバーに要求を送信するためのもので、もう 1 つはサーバーからの応答を受信するためのものです。これは非同期プロトコルです。私の問題は、失敗した場合に shared_memory_objects を安全に削除する方法がわからないことです。次のシナリオを検討してください。

  1. サーバーの起動
  2. クライアントが起動してサーバーに接続します。メッセージ キューは共有メモリに作成されます。
  3. クライアントは定期的にハートビートをサーバーに送信します。全て大丈夫。
  4. 処理が多すぎるため、クライアントが処理を停止します。いくつかの心拍を逃します
  5. サーバーはクライアントが死んでいると判断し、キューをクリーンアップします (shared_memory_object::remove は、その共有メモリ セグメントへのハンドルが開いている実行中のプロセスがある場合でも、キューを削除します)
  6. クライアントは処理を終了します。削除されたメッセージキューへの書き込みを試みます:

ここですべての地獄が解き放たれます。書き込みが成功することもあれば、クラッシュすることもあります。メッセージキューが削除された後、他のプロセスが同じメモリアドレスに新しい共有メモリオブジェクトを作成したかどうかは誰にもわかりません...

明らかに、クライアントがサーバーがダウンしていると判断してキューを削除すると、キューに対して読み取り/書き込みを試行するサーバー スレッドがクラッシュする (またはメモリが破損する) 可能性があります。

4

0 に答える 0