假设您在共享内存中有一个引用计数对象。引用计数表示使用对象的进程数,进程负责通过原子指令递增和递减计数,所以引用计数本身也是在共享内存中的(可以是对象的字段,也可以是对象可能包含指向计数的指针,如果他们有助于解决这个问题,我愿意接受建议)。有时,一个进程会有一个错误,阻止它减少计数。您如何尽可能轻松地找出哪个进程没有减少计数?
我想到的一个解决方案是给每个进程一个 UID(也许是他们的 PID)。然后,当进程递减时,它们会将其 UID 推送到与引用计数一起存储的链表上(我选择了链表,因为您可以使用CAS原子地附加到头部)。当你想调试时,你有一个特殊的过程来查看仍然存在于共享内存中的对象的链表,并且无论哪个应用程序的 UID 不在列表中,都是那些尚未减少计数的应用程序的 UID。
此解决方案的缺点是它使用 O(N) 内存,其中 N 是进程数。如果使用共享内存区域的进程数量很大,并且您有大量对象,那么这很快就会变得非常昂贵。我怀疑可能有一个中途解决方案,使用部分固定大小的信息,您可以通过某种方式缩小可能进程的列表来帮助调试,即使您无法查明一个进程。或者,如果您可以检测到只有一个进程没有减少时哪个进程没有减少(即无法处理检测到 2 个或多个未能减少计数的进程),那可能仍然会有很大帮助。
(对于这个问题有更多的“人为”解决方案,比如确保所有应用程序使用同一个库来访问共享内存区域,但是如果共享区域被视为二进制接口并且并非所有进程都将是由你那是你无法控制的。此外,即使所有应用程序都使用同一个库,一个应用程序也可能在库之外有一个错误,以防止减少计数的方式破坏内存。是的,我使用的是一种不安全的语言,比如C/C++ ;)
编辑:在单进程情况下,您将拥有控制权,因此您可以使用RAII(在 C++ 中)。