Привет. Помогите, плиз, с потоками, а то оно всё какое-то страшное. Надо выполнить гарантированное завершение потока, и при этом не завесить «управляющий» поток. То есть, пусть в потоке крутится какой-то цикл, и опрашивает переменную ThreadTerminated, при установке которой в 1 поток благополучно завершается сам. Тут вопросов нет. Но если вдруг этот поток где-то внутри завис, на такой случай не пойму как это проверить и завершить. Под виндами я делал примерно так:
ThreadTerminate := true;
if WaitForSingleObject(hThread, 5000) = WAIT_TIMEOUT then TerminateThread(hThread);
И всё. Если поток нормально работает, то он быстренько проверит значение ThreadTerminate и «умрет» самостоятельно. Если же он висит, то через 5 секунд будет прибит принудительно, но главное - поток в котором приведенный код выполняется, так или иначе, продолжит работу, а поток hThread будет, так или иначе, завершен.
Ближайший аналог в pthreads, который я нашел - это pthread_join(thread, value). Но тайм-аут в нем не предусмотрен, т.е. если поток положил большой болт на значение ThreadTerminate, то при выполнении pthread_join() повиснет и этот, вызвавший функцию, поток. А если join не делать, то есть вероятность, что тот поток так и продолжит висеть. Можно, конечно, вызвать pthread_cancel(), но для этого надо знать, что поток самостоятельно умирать не желает. А как это проверить без join?