如何在pthread_join上停止线程停止?

时间:2017-11-18 12:19:01

标签: c queue pthreads mutex pthread-join

我有一个项目,我在队列中添加作业,我有多个线程从事工作,并计算自己的独立结果。

我的程序处理SIGINT信号,我尝试加入线程以添加结果,打印到屏幕,然后退出。我的问题是,当我发送信号时,线程似乎停止运行,或者它们在mutex_lock上被阻止。以下是我的计划的重要部分,以便简洁。

的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;
}

thread_stuff.c

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;
}

感谢您的帮助,这让我很头疼!

1 个答案:

答案 0 :(得分:2)

您不应该从处理异步生成的信号(如pthread_cond_wait)的信号处理程序中调用pthread_joinSIGINT。相反,您应该阻止所有线程SIGINT,生成专用线程,并在那里调用sigwait。这意味着您可以在信号处理程序上下文之外检测到SIGINT信号的到达,这样您就不会受async-signal-safe functions的限制。如果将信号传递给其中一个工作线程,您还可以避免自死锁的风险。

此时,您只需要有序地关闭工作队列/线程池。根据详细信息,使用running标志的现有方法甚至可以保持不变。