我正在研究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)
}
}
任何人都可以帮助我吗?或者,如果有更好的方法来实现这一目标?在此先感谢:)
答案 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”,其他线程迟早会注意到。
您可以在线程函数的多个位置检查此退出条件,特别是如果某个线程正在等待当前活动线程(设置退出条件的线程)的锁定。