Всегда выпускать QSemaphore перед удалением? - PullRequest
0 голосов
/ 31 января 2012
  • Нужно ли выпускать QSemaphore перед удалением?

  • Если да, мне следует позвонить semaphore->release(n) до delete semaphore, но как мне узнать, сколько (n) ресурсов получено? (Я знаю, сколько ресурсов available(), но не общий «размер» семафора.)

Причина моего вопроса: Я выискиваю утечки памяти и нашел QSemaphore, который создал утечку памяти, хотя delete был (кажется, был вызван) для него. Возможно, это произошло потому, что он был выпущен неправильно - В документе написано: " Предупреждение: Уничтожение используемого семафора может привести к неопределенному поведению. "

Редактировать: Утечка памяти фактически была результатом функции дампа памяти, размещенной до уничтожения всех объектов. Добавление дополнительной области { ... } помогло там Тем не менее, мой вопрос остается.

1 Ответ

2 голосов
/ 31 января 2012

Я не думаю, что вам нужно выпустить семафор перед уничтожением, так как release() просто добавляет указанное количество ресурсов (или разрешений ) ксемафор.Если вы посмотрите на примеры для QSemaphore, то обнаружите, что release() может увеличить количество доступных разрешений сверх первоначальной суммы.

То, что документ говорит, что ни один поток не должен работать с семафором, который разрушается.Другими словами, все потоки должны завершить свои вызовы методов объекта семафора, какими бы они ни были, прежде чем он может быть безопасно уничтожен.И сам класс не поддерживает это;это исключительно прикладная ответственность, чтобы гарантировать это, внешними средствами.На самом деле, в многопоточном программировании распространена ситуация, когда уничтожение объекта (даже объекта синхронизации), который все еще используется, небезопасен.

...