Если он зависает бесконечно, то да, есть какой-то тип блокировки (или опрос и т. Д. ... что-то происходит в функции, заставляя ее не возвращаться).
Из вашего другого вопроса, который вы опубликовали по этому вопросу, если вы хотите просто убить конкретный поток, который завис, то вы можете посмотреть на то, как настроить идентификаторы потоков в виде структуры, имеющей флаг «закончено» в это.
#include <pthread.h>
#include <signal.h>
struct thread_id
{
pthread_t thread;
sig_atomic_t thread_flag;
};
void init_thread_id(struct thread_id* id)
{
id->thread_flag = 0;
}
thread_id threads[NUMBER_OF_THREADS];
void* thread_function(void* arg)
{
thread_id* my_id = (thread_id*)arg;
//do something in your thread
//when you finish, set the flag for that thread
my_id->thread_flag = 1;
}
Теперь, когда вы установите будильник, просто прокрутите массив thread_id
и посмотрите, какие из них завершены. Те, которые завершены, вы можете вызвать pthread_join
on, в противном случае вы можете отправить сигнал потоку, используя pthread_kill
или pthread_cancel
, чтобы остановить поток.