Сигнализация определенного потока среди множества ожидающих условной переменной - PullRequest
0 голосов
/ 03 августа 2011

Этот вопрос следует из Преодоление взаимоблокировки условной переменной .Множество потоков может ожидать переменную условия, мне нужно сигнализировать только конкретному потоку, скажем, поток 1, и уничтожить его, поскольку он был участником сценария взаимоблокировки.Есть ли способ, которым я мог бы сигнализировать только частичную нить среди партии.

Был бы благодарен за некоторую помощь

спасибо

Редактировать;Уважая комментарии Немо.Я понимаю, что это плохая идея.Но есть ли способ сделать это

Ответы [ 2 ]

1 голос
/ 03 августа 2011

Вы можете использовать отложенные точки отмены.В ваших потоках используйте pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldstate); (это значение по умолчанию, но оно никогда не мешает быть явным);затем отключите отмену с помощью pthread_setcancelstate, за исключением того, что переменная условия ожидает, что вы хотите отменить.Убедитесь, что вы используете pthread_cleanup_push для настройки обработчиков очистки отмены;это НЕ будет хорошо работать с RAII.

И теперь вы можете просто pthread_cancel свою ветку.Обработчики очистки отмены выполняются, в обратном порядке регистрации, вызывается деструктор данных TLS, и поток завершается (без возврата из условной переменной wait).

Конечно, это довольно уродливый дизайн.В идеале вы должны вообще избегать блокировок;если это невозможно, если бы это был я, я бы организовал блокировку только одного потока на одном cvar за раз и построил конструкцию более высокого уровня (явный список официантов) на основе этих cvars для обработки несколькихофицианты, хотя все еще допускают индивидуальную адресацию потоков.

0 голосов
/ 28 августа 2011

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

...