За ваш ответ (в другом месте в этом посте) с указанием:
Спасибо, вот что я пытаюсь сделать
- два процесса, А и В
- malloc
p_my_t
в A, B имеет N потоков и может получить к нему доступ
- начать удаление в A, но я не могу просто освободить его, поскольку потоки в B все еще могут использовать.
- поэтому я вызываю функцию, передавая адрес
p_my_t
в B, чтобы установить его адрес на NULL в B, чтобы другие потоки в B больше не могли использовать
- После обратного звонка из B я освобождаю память в A
Вам нужна какая-то форма синхронизации между всеми вашими потоками и процессами. Я не уверен, как вы разделяете этот объект между процессами, но я подозреваю, что вы используете общую память.
Обычно я бы рекомендовал использовать класс общего указателя (например, класс shared_ptr
Boost), но я не уверен, насколько хорошо это будет работать в этом сценарии. Возможно, вы захотите настроить свой класс так, чтобы он отслеживал свои собственные ссылки и мог использоваться с классом Boost intrusive_ptr
.
Таким образом, процесс A может просто забыть об объекте, и когда процесс B завершится, экземпляр my_T
узнает, что больше нет ссылок, и очистит себя.
Синхронизация вступает в действие здесь, когда my_T
добавляет или удаляет ссылки внутри (поэтому вы не сталкиваетесь с неприятными условиями гонки, когда вам кажется, что она должна себя очистить, но она все еще используется).
Еще один подход, который имеет немного больше смысла "kluge", состоит в том, чтобы присвоить каждому экземпляру my_T
флаг "is-valid", чтобы все использующие его процессы / потоки знали, продолжать или нет при этом.
Для получения более подробной информации о различных классах указателей Boost, посмотрите их документацию .