Вам придется зависеть от чего-то другого, кроме стандартных классов iostream, потому что они не обеспечивают select()
стиль поведения.
Кроме того, уничтожение потока невозможно с помощью POSIX (и полностью нарушено в Windows). Вы можете отправить запрос на отмену через pthread_cancel()
, но в вашем случае он может застрять в не отменяемом системном вызове. Особый интерес для вас read()
может быть отменен или не отменен, в зависимости от среды. По крайней мере, одна среда говорит, что точка отмены может встречаться в read()
, хотя по общему признанию это слой Windows POSIX. Кроме того, в Mac OS X, только в Leopard 10.5.1 , была нарушена реализация read()
в отношении отменяемости.
Пройдя через это препятствие, вы также должны учитывать непростую связь между деструкторами C ++ и pthread_cancel. Не все среды гарантируют, что деструкторы будут вызываться, поэтому вы должны быть крайне осторожны при использовании pthread_cancel в коде C ++.
Короче говоря, для прерывистых входов / выходов используйте низкоуровневые входы / выходы и select()
: один fd для ввода / вывода, второй fd (созданный pipe()
) для сигнализации. Или, если вы смелы, используйте AIO , но вам, вероятно, лучше использовать высокоуровневый интерфейс, такой как Boost.Asio .