Supongamos que tiene un objeto contado de referencia en la memoria compartida. El recuento de referencias representa el número de procesos que utilizan el objeto, y los procesos son responsables de incrementar y disminuir el recuento mediante instrucciones atómicas, por lo que el recuento de referencia también se encuentra en la memoria compartida (podría ser un campo del objeto o el objeto podría contener un puntero al recuento, estoy abierto a sugerencias si ayudan a resolver este problema). Ocasionalmente, un proceso tendrá un error que le impedirá disminuir el recuento. ¿Cómo hace que sea tan fácil como sea posible averiguar qué proceso no está disminuyendo el conteo?¿Cómo se pueden depurar con eficacia los problemas de recuento de referencias en la memoria compartida?
Una solución en la que he pensado es dar a cada proceso un UID (quizás su PID). Luego, cuando los procesos disminuyen, insertan su UID en una lista vinculada almacenada junto con el recuento de referencias (elegí una lista vinculada porque puedes agregar atómicamente a la cabeza con CAS). Cuando desee depurar, tiene un proceso especial que mira las listas enlazadas de los objetos que aún están vivos en la memoria compartida, y los UIDs de las aplicaciones que no están en la lista son los que aún tienen que disminuir el recuento.
La desventaja de esta solución es que tiene un uso de memoria O (N) donde N es el número de procesos. Si la cantidad de procesos que usan el área de memoria compartida es grande y tiene una gran cantidad de objetos, esto se vuelve muy costoso rápidamente. Sospecho que podría haber una solución a mitad de camino donde con información parcial de tamaño fijo podría ayudar a la depuración de alguna manera, pudiendo reducir la lista de posibles procesos, incluso si no se puede identificar uno solo. O bien, si pudieras detectar qué proceso no ha decrementado cuando solo un proceso no lo ha hecho (es decir, si no se puede controlar la detección de 2 o más procesos que no reducen el recuento), eso probablemente sea una gran ayuda.
(Hay más soluciones "humanas" para este problema, como asegurarse de que todas las aplicaciones utilicen la misma biblioteca para acceder a la región de memoria compartida, pero si el área compartida se trata como una interfaz binaria y no todos los procesos van a Las aplicaciones escritas por usted que están fuera de su control. Además, incluso si todas las aplicaciones usan la misma biblioteca, una aplicación puede tener un error fuera de la biblioteca que corrompe la memoria de tal manera que no puede disminuir el conteo. Sí, estoy usando un lenguaje inseguro como C/C++;)
Editar: En situaciones de proceso único, tendrá el control, por lo que puede usar RAII (en C++).
Una vez que descubro cómo depurar eficientemente los problemas de recuento de referencias en la memoria normal (proceso único), pasaré a este problema. –
Este es un problema muy difícil porque DCOM nunca obtuvo una buena solución para –
@Terry: en una sola situación de proceso puede usar RAII. –