Уведомление о завершении объекта C ++ - PullRequest
6 голосов
/ 27 июля 2010

В программе на C ++ у меня есть два объекта с подсчетом ссылок: King и Heir . Наследник должен блокировать, пока король не будет уничтожен. King - это объект подсчета ссылок, который будет уничтожен, когда его счетчик ссылок станет равным нулю. Если у Наследника есть ссылка на Кинга, то счетчик ссылок Кинга никогда не станет равным нулю. Как может наследник блокировать, пока Кинг не будет уничтожен?

Ответы [ 2 ]

10 голосов
/ 27 июля 2010

Вы можете использовать не владеющую (или "слабую") ссылку, аналогично как weak_ptr работает .

Что касается ожидания, пока король не умрет, вы можете использоватьмьютекс, который может удерживать король, пока он не умрет, и блок наследников ждет, пока король его освободит.

Если вам нужно ждать нескольких наследников, и у наследников есть какой-то порядок, вы можете получитьОбъект «селектор наследников», который отслеживает список наследников и их порядок приоритета, и когда король освобождает мьютекс, он назначает право собственности на этот мьютекс следующему наследнику в списке.

0 голосов
/ 27 июля 2010

Спасибо @James.Вот решение, которое я в итоге выбрал:

Метод мьютекса казался многообещающим, но большинство мьютексов ожидают, что поток получения и освобождения будет одинаковым.В конце я попросил Хеира создать семафор с нулевым счетчиком в стеке, передать указатель на семафор King, освободить King, а затем попытаться получить семафор.Счет равен нулю, поэтому наследник немедленно блокирует.Когда вызывается деструктор Кинга, он вызывает «релиз» на семафоре.Кажется, это работает нормально с семафором Rogue Wave.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...