Деструктор против функции-члена гонки - PullRequest
7 голосов
/ 20 января 2009

Когда я нахожусь внутри деструктора, возможно ли, что какой-то другой поток начнет выполнять функцию-член объекта? Как бороться с этой ситуацией?

Ответы [ 3 ]

17 голосов
/ 20 января 2009

C ++ не имеет встроенной защиты от использования объекта после его удаления - забудьте об условиях гонки - другой поток может использовать ваш объект после того, как он будет полностью удален.

Или:

  1. Убедитесь, что только одно место в Код владеет объектом, и это ответственность за удаление, когда никто использует объект.
  2. Сделать ссылка на объект подсчитана - добавлена код явного подсчета ссылок, или найти подходящий базовый класс который реализует подсчет ссылок
15 голосов
/ 20 января 2009

Вы не должны уничтожать объект, если не уверены, что больше никто не будет пытаться его использовать - в идеале, ничто иное не имеет ссылки на него. Вам нужно будет присмотреться, когда вы вызываете delete.

2 голосов
/ 20 января 2009

В случае, если вы находитесь в деструкторе из-за разматывания стека в обработчике исключений, я предлагаю перестроить ваш код таким образом, чтобы вы перехватывали исключения внутри сериализованного блока.

После блока вы проверяете, является ли объект все еще действительным, и вызываете ваш метод. Таким образом, исключение в одном потоке позволит другим потокам корректно обрабатывать вызов деструктора.

...