К сожалению, я не вижу другого способа, кроме опроса, вместо того, чтобы использовать ожидание, использовать временное ожидание и переменную, чтобы указать, что прерывание выполнено.
void th(Interruptor& interruptor) {
try {
...
while (cnd1.timed_wait(d)==false) {
interruptor.check_interruption_point();
}
...
} catch (interrupted_exception &) {}
}
Класс Interruptor будет поддерживать булеву переменную, защищенную мьютексом или использующую атомарные операции, если они у вас есть, и две функции interrupt и check_interruption_point, которые выдают исключение interrupted_exception, если логическое значение true. Поток Mater создаст переменную Interruptor, которая будет передана заинтересованным потокам во время создания. Мастер имеет возможность прерывать сразу все потоки, которые зависят от этого прерывателя. Конечно, вы можете создать прерыватель для каждого потока, если хотите явно прерывать один поток за раз.
Вы сами можете определить продолжительность времени ожидания, чтобы ваши потоки могли реагировать, как только ваша программа требует.