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