LINUX.ORG.RU

pthreads завершить поток


0

0

Привет. Помогите, плиз, с потоками, а то оно всё какое-то страшное. Надо выполнить гарантированное завершение потока, и при этом не завесить «управляющий» поток. То есть, пусть в потоке крутится какой-то цикл, и опрашивает переменную 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?

pthread_tryjoin_np
pthread_timedjoin_np

tim239 ★★
()

В линуксе треды - это процессы с общей памятью (и не только памятью, но память - самая суть). Т.к. это процессы, то им можно слать сигналы. Например, SIGKILL.

mv ★★★★★
()

> Можно, конечно, вызвать pthread_cancel(), но для этого надо знать, что поток самостоятельно умирать не желает.

4.2

LamerOk ★★★★★
()

может быть что-то типа alarm(5); pthread_join(....); alarm(0);

anonymous
()

А вариант делать pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, 0); в thread function не катит? Тогда можно безболезненно вызывать pthread_cancel().

sjinks ★★★
()
Ответ на: комментарий от tim239

Result

Да, с помощью pthread_timedjoin_np удалось сделать то, что нужно. Но я не проверил пока ещё это на FreeBSD. Просто не доходят руки до неё. Извиняюсь за задержку — времени очень мало :-(

shamus24
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.