C 如何停止pthread_join上的线程暂停?

C 如何停止pthread_join上的线程暂停?,c,queue,pthreads,mutex,pthread-join,C,Queue,Pthreads,Mutex,Pthread Join,我有一个项目,我将作业添加到队列中,我有多个线程接受作业,并计算它们自己的独立结果 我的程序处理SIGINT信号,我试图加入线程,将结果相加,打印到屏幕上,然后退出。我的问题是,当我发送信号时,线程似乎停止工作,或者它们在互斥锁上被阻塞。为了简洁起见,以下是我的程序的重要部分 main.c //the thread pool has a queue of jobs inside //called jobs (which is a struct) struct thread_pool * pool

我有一个项目,我将作业添加到队列中,我有多个线程接受作业,并计算它们自己的独立结果

我的程序处理SIGINT信号,我试图加入线程,将结果相加,打印到屏幕上,然后退出。我的问题是,当我发送信号时,线程似乎停止工作,或者它们在互斥锁上被阻塞。为了简洁起见,以下是我的程序的重要部分

main.c

//the thread pool has a queue of jobs inside
//called jobs (which is a struct)
struct thread_pool * pool;

void signal_handler(int signo) {
    pool->jobs->running = 0; //stop the thread pool
    pthread_cond_broadcast(pool->jobs->cond);

    for (i = 0; i < tpool->thread_count; i++) {
        pthread_join(tpool->threads[i], retval);
        //do stuff with retval
    }

    //print results then exit
    exit(EXIT_SUCCESS);
}

int main() {
    signal(SIGINT, signal_handler);
    //set up threadpool and jobpool
    //start threads (they all run the workerThread function)
    while (1) {
        //send jobs to the job pool
    }
    return 0;
}
void add_job(struct jobs * j) {
    if (j->running) {
        pthread_mutex_lock(j->mutex);
        //add job to queue and update count and empty
        pthread_cond_signal(j->cond);
        pthread_mutex_unlock(j->mutex);
    }
}

struct job * get_job(struct jobs * j) {

    pthread_mutex_lock(j->mutex);

    while (j->running && j->empty)
        pthread_cond_wait(j->cond, j->mutex);

    if (!j->running || j->empty) return NULL;

    //get the next job from the queue
    //unlock mutex and send a signal to other threads
    //waiting on the condition
    pthread_cond_signal(j->cond);
    pthread_mutex_unlock(j->mutex);
    //return new job
}

void * workerThread(void * arg) {
    struct jobs * j = (struct jobs *) arg;
    int results = 0;
    while (j->running) {
        //get next job and process results
    }
    return results;
}

谢谢你的帮助,这真让我头疼

您不应该从处理异步生成的信号(如
SIGINT
)的信号处理程序调用
pthread\u cond\u wait
pthread\u join
。相反,您应该为所有线程阻塞
SIGINT
,生成一个专用线程,并在那里调用
sigwait
。这意味着您在信号处理程序上下文之外检测到
SIGINT
信号的到达,因此您不受限制。如果信号被传递到一个工作线程,您还可以避免自死锁的风险


此时,您只需要有序地关闭工作队列/线程池。根据具体情况,使用
running
标志的现有方法甚至可能不会改变。

您不应该从处理异步生成的信号(如
SIGINT
)的信号处理程序调用
pthread\u cond\u wait
pthread\u join
。相反,您应该为所有线程阻塞
SIGINT
,生成一个专用线程,并在那里调用
sigwait
。这意味着您在信号处理程序上下文之外检测到
SIGINT
信号的到达,因此您不受限制。如果信号被传递到一个工作线程,您还可以避免自死锁的风险


此时,您只需要有序地关闭工作队列/线程池。根据具体情况,您使用
运行
标志的现有方法可能不会改变。

如果您阅读,您将在第2.4.3节末尾看到异步安全的函数列表,因此可以从信号处理程序安全地使用这些函数。如果你仔细查看这个列表,你会发现它没有被列出。这意味着您不应该在信号处理程序中调用它。如果您阅读,您将在第2.4.3节末尾看到一个异步安全的函数列表,因此可以从信号处理程序安全地使用这些函数。如果你仔细查看这个列表,你会发现它没有被列出。这意味着你不应该在信号处理器中调用它。太棒了,谢谢!由于关机而退出get_job函数时,我也遇到了一个问题:我没有解锁互斥锁:')),那么pthread_join不是异步信号安全函数的原因是什么呢?很少有函数是异步信号安全的
pthread_join
需要释放资源,操作堆的函数从来都不是异步信号安全的,因为POSIX不需要异步信号安全的内存分配器。非常感谢!由于关机而退出get_job函数时,我也遇到了一个问题:我没有解锁互斥锁:')),那么pthread_join不是异步信号安全函数的原因是什么呢?很少有函数是异步信号安全的
pthread_join
需要释放资源,操作堆的函数从来都不是异步信号安全的,因为POSIX不需要异步信号安全的内存分配器。