Хорошо, в Linux я использую pthread_signal (SIGUSR1), так как он прерывает блокировку ввода-вывода. Там нет такого вызова на окнах, как я обнаружил при переносе моего кода. Только устаревший в вызове чтения сокета. В окнах вы должны явно определить событие, которое прервет ваш блокирующий вызов. Так что не существует такой вещи (AFAIK), как универсальный способ прерывать блокировку ввода-вывода.
Дизайн boost.thread справляется с этим, управляя четко определенными точками прерывания. Я не знаю boost.asio хорошо, и кажется, что вы все равно не хотите на это полагаться. Если вы не хотите, чтобы рефакторинг использовал неблокирующую парадигму, вы можете использовать что-то между неблокирующим (опросом) и блокирующим IO. То есть сделать что-то вроде (псевдокод?):
while(!stopped && !interrupted)
{
io.blockingCall(timeout);
if(!stopped && !interrupted)
{
doSomething();
}
}
Затем вы прерываете свои два потока и присоединяетесь к ним ...
Возможно, это проще в вашем случае? Если у вас есть главный поток, который знает, что один поток закончен, вам просто нужно закрыть IO другого потока?
Edit:
Кстати, меня интересует окончательное решение, которое у вас есть ...