C Pthread:通过一个线程优雅地杀死其他线程

时间:2016-04-08 01:22:58

标签: c linux multithreading pthreads

我正在研究C中的pthread问题。

问题的背景:有5个线程使用相同的功能,当共享内存中的核心数据达到上限时,所有这五个线程都应该终止。我使用信号量来确保它们中只有一个执行核心数据,这意味着五个中只有一个将获得结束信号然后它会告诉其余的终止。我写的代码是:

#define THREAD_NUM 5;
int thread[THREAD_NUM];
sem_t s;       /*semaphore to synchronize*/
sem_t empty;   /*keep check of the number of empty buffers*/
sem_t full;    /*keep check of the number of full buffers*/


void com_thread(*prt){ // I pass the id of the thread using prt
     while(1){
        sem_wait(&full)
        sem_wait(&s)
        ...do something
        sem_post(&s)
        sem_post(&empty)
     }   
}

当while循环运行时,信号将会出现,我尝试接受以下位置的信号,然后终止所有线程。

老实说,我需要做的是优雅地结束所有线程,我需要它们返回主线程的thread_join()和空闲内存而不是简单地退出程序。所以这就是我没有在这里使用exit()的原因。

下面的主要思想是当其中一个线程获得信号时终止其他4个线程。之后它会自行终止。

然而,它并不像我预期的那样有效。

#define THREAD_NUM 5;
int thread[THREAD_NUM];
sem_t s;       /*semaphore to synchronize*/
sem_t empty;   /*keep check of the number of empty buffers*/
sem_t full;    /*keep check of the number of full buffers*/


void com_thread(*prt){ // I pass the id of the thread using prt
     while(1){
        sem_wait(&full)
        sem_wait(&s)

        if(signal){
            int i;
            int id = *((int*) prt);
            for (i=0;i<THREAD_NUM;i++){
                if(i != id)
                pthread_exit(&thread[i]);
            }
            pthread_exit(&thread[id]);
        }

        ...do something
        sem_post(&s)
        sem_post(&empty)
     }   
}

任何人都可以帮助我吗?或者,如果有更好的方法来实现这一目标?在此先感谢:)

2 个答案:

答案 0 :(得分:0)

您可以从要终止所有其他线程的线程中使用pthead_kill。手册页位于http://linux.die.net/man/3/pthread_kill。如果你想要优雅的终止,你应该仔细选择信号。 http://linux.die.net/man/7/signal有更多详情。

答案 1 :(得分:0)

最简单的解决方案可能是拥有一个全局布尔变量,最初初始化为“false”。所有线程都检查此变量是“false”还是“true”,如果它是“true”则终止。

当一个线程注意到所有线程都应该被终止时,它只是将这个标志设置为“true”,其他线程迟早会注意到。

您可以在线程函数的多个位置检查此退出条件,特别是如果某个线程正在等待当前活动线程(设置退出条件的线程)的锁定。