共有メモリに参照カウント オブジェクトがあるとします。参照カウントはオブジェクトを使用するプロセスの数を表し、プロセスはアトミック命令を介してカウントを増減する責任があるため、参照カウント自体も共有メモリにあります (オブジェクトのフィールドまたはオブジェクトのフィールドである可能性があります)。カウントへのポインターが含まれている可能性があります。この問題の解決に役立つ場合は、提案を受け付けています)。場合によっては、プロセスにバグがあり、カウントをデクリメントできないことがあります。どのプロセスがカウントを減少させていないかをできるだけ簡単に把握するにはどうすればよいでしょうか?
私が考えた解決策の 1 つは、各プロセスに UID (おそらく PID) を与えることです。次に、プロセスが減少すると、UID を参照カウントと一緒に保存されたリンク リストにプッシュします (リンク リストを選択したのは、CASを使用してヘッドにアトミックに追加できるためです)。デバッグする場合、共有メモリ内でまだ生きているオブジェクトのリンクされたリストを調べる特別なプロセスがあり、リストにないアプリの UID は、まだカウントを減らしていないアプリです。
このソリューションの欠点は、N がプロセスの数である場合、O(N) のメモリ使用量があることです。共有メモリ領域を使用するプロセスの数が多く、多数のオブジェクトがある場合、これはすぐに非常に高価になります。単一のプロセスを特定できなくても、部分的な固定サイズ情報を使用して、可能なプロセスのリストを何らかの方法で絞り込むことができ、デバッグを支援できる中途半端な解決策があるのではないかと思います。または、1 つのプロセスだけが減少していないときにどのプロセスが減少していないかを検出できた場合 (つまり、カウントの減少に失敗した 2 つ以上のプロセスの検出を処理できない場合)、それはおそらく大きな助けになるでしょう。
(この問題には、すべてのアプリケーションが同じライブラリを使用して共有メモリ領域にアクセスするようにするなど、より「人間的な」解決策がありますが、共有領域がバイナリ インターフェイスとして扱われ、すべてのプロセスが によって作成されたアプリケーションになるわけではありません。また、すべてのアプリが同じライブラリを使用している場合でも、1 つのアプリにライブラリの外部にバグがあり、カウントを減らすことができないような方法でメモリを破壊している可能性があります。 C/C++ ;)
編集:単一プロセスの状況では、制御できるため、RAII (C++) を使用できます。