Предположим, у вас есть подсчитанный объект в общей памяти. Счетчик ссылок представляет количество процессов, использующих объект, а процессы отвечают за увеличение и уменьшение счетчика с помощью атомарных инструкций, поэтому сам счетчик ссылок также находится в общей памяти (это может быть поле объекта или объект). может содержать указатель на количество, я открыт для предложений, если они помогут в решении этой проблемы). Иногда у процесса будет ошибка, которая не позволяет ему уменьшить счетчик. Как сделать так, чтобы как можно проще было выяснить, какой процесс не уменьшает счет?
Одно из решений, которое я придумал, - дать каждому процессу UID (может быть, PID). Затем, когда процессы уменьшаются, они помещают свой UID в связанный список, хранящийся вместе со счетчиком ссылок (я выбрал связанный список, потому что вы можете атомарно добавить заголовок с CAS ). Когда вы хотите выполнить отладку, у вас есть специальный процесс, который просматривает связанные списки объектов, которые все еще живы в общей памяти, и те UID приложений, которых нет в списке, - это те, которые еще не уменьшили счет.
Недостатком этого решения является то, что оно использует O (N) памяти, где N - количество процессов. Если число процессов, использующих область общей памяти, велико, и у вас есть большое количество объектов, это быстро становится очень дорогим. Я подозреваю, что могло бы быть решение на полпути, где с частичной информацией фиксированного размера вы могли бы помочь отладке, каким-то образом сузив список возможных процессов, даже если вы не могли точно определить ни одного из них. Или, если бы вы могли просто определить, какой процесс не уменьшился, если только один процесс этого не сделал (то есть не смог обработать обнаружение двух или более процессов, не сумели уменьшить счетчик), это, вероятно, все равно было бы большой помощью.
(Существует более «человеческое» решение этой проблемы, например, обеспечение того, чтобы все приложения использовали одну и ту же библиотеку для доступа к области общей памяти, но если общая область рассматривается как двоичный интерфейс, и не все процессы будут приложения, написанные вами вне вашего контроля.Кроме того, даже если все приложения используют одну и ту же библиотеку, одно приложение может иметь ошибку вне библиотеки, приводящую к повреждению памяти таким образом, что предотвращается уменьшение счетчика. Да, я использую небезопасный язык, такой как C / C ++;)
Редактировать: В ситуациях с одним процессом у вас будет контроль, поэтому вы можете использовать RAII (в C ++).