Как я могу сигнализировать об отмене / пробуждении всех потоков, ожидающих переменную условия перед вызовом pthread_cond_destroy? - PullRequest
0 голосов
/ 29 ноября 2018

Мне известно о неопределенном поведении при вызове pthread_cond_destroy (), когда есть поток 1+, ожидающий на условной переменной, и я ищу обходной путь для отправки сигнала пробуждения всем потокам , ожидающим наусловная переменная перед вызовом pthread_cond_destroy ().

Мой деструктор класса CV вызывает pthread_cond_destroy (), если условная переменная допустима.Поэтому я подумал:

  1. Передача перед вызовом pthread_cond_destroy (), но это приведет к пробуждению только 1 потока.Я хочу, чтобы деструктор завершился успешно и чтобы ни один поток не мог ждать объекта cv (нет разыменования на разрушенном объекте).

  2. Способ подсчета сигналов (наряду с обходным решением № 1)исправить эту проблему?Если да, как я могу убедиться, что все ожидающие потоки были запланированы (разбужены) до успешного выполнения ~ CV ()?

  3. Преодолеть ли я эту проблему, если использую поток или условие C ++ 11переменная?

1 Ответ

0 голосов
/ 30 ноября 2018

Вот как я бы это сделал (при условии, что вы хотите уничтожить условную переменную, потому что вы очищаетесь и хотите, чтобы потоки выходили; если вы не хотите, чтобы потоки выходили, то вам не следует уничтожать условиепеременная, которую они используют):

  1. Установите логический флаг (или что-то), который указывает, что вы хотите, чтобы все потоки исчезли
  2. Вызовите pthread_cond_broadcast (), чтобы разбудить всепотоки (чтобы они могли проверить флаг, увидеть, что он установлен, и ответить, просто выйдя)
  3. вызовите pthread_join () в каждом из потоков, чтобы вы знали, что все они пропали, и онпоэтому безопасно переходить к следующему шагу
  4. вызовите pthread_cond_destroy (), чтобы уничтожить переменную условия (теперь это безопасно сделать, потому что вы знаете, что нет потоков, использующих ее, потому что все они вышли до завершения шага 3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...