線程我有這樣的疑問:殺從另一個線程
- 我怎麼能殺死一個線程(可能與
pthread_cancel()
)從另一個線程?
以下是示例代碼。 我需要,當我按1,其他線程被殺害。 (我必須強制殺死一個線程,而又不會讓pthread_exit()
的除外)。
pthread_t THR_INPUT, THR_QUEUE;
void *thr_in(void *null) {
int opt;
while(1){
printf("1. Kill the other thread\n");
scanf("%d", &opt);
switch (opt)
{
case 1:
pthread_cancel(THR_QUEUE);
pthread_exit(NULL);
default:
printf("ATTENZIONE: Scelta %i non corretta. Riprovare.\n",opt);
}
}
}
void *thr_qu(int reparto) {
while(1){
sleep(2);
printf("I'm alive!");
}
}
int main(int argc, const char * argv[]){
void *result;
printf("-------start-------\nMenu:\n");
pthread_mutex_init(&mutex, NULL);
pthread_create(&THR_INPUT, NULL, thr_in, NULL);
pthread_create(&THR_QUEUE, NULL, thr_qu(reparto), NULL);
pthread_join(THR_INPUT, &result);
pthread_join(THR_QUEUE, &result);
printf("---end---\n");
exit(EXIT_SUCCESS);
}
我想到一個解決方案,但我不知道它是多麼乾淨;只是這樣做:
int main(int argc, const char * argv[]){
void *result;
sem = semget(SEM_KEY, 0, 0);
pthread_mutex_init(&mutex, NULL);
int pid=getpid();
pid=fork();
if(!pid){
printf("-------START-------\nMenu:\n");
pthread_create(&THR_INPUT, NULL, thr_in, NULL);
pthread_create(&THR_QUEUE, NULL, thr_qu(reparto), NULL);
pthread_join(THR_INPUT, &result);
pthread_join(THR_QUEUE, &result);
}
else{
wait(sem,0);
pthread_cancel(THR_QUEUE);
printf("---END---\n");
}
exit(EXIT_SUCCESS);
}
,並把信號在第一線,當它被要求退出,信號在主線程的信號做pthread_cancel()
。但它仍然不工作,我不知道爲什麼
這是撥錯:'在pthread_create(THR_QUEUE,NULL,thr_qu(reparto),NULL);',應該是'在pthread_create(THR_QUEUE,NULL,thr_qu,reparto)' 什麼 – 2013-04-24 19:37:57
嗯,在你的方式,我不能編譯..我認爲我犯了一個錯誤設置void * thr_qu(int reparto),所以我重寫void * thr_qu(void * null),並調用pthread_create(&THR_QUEUE,NULL,thr_qu,NULL)。無論如何,我在線程參數中真的很新,所以我必須學習很多東西,比如如何將一些值傳遞給主線程中的線程。 – ReTanica 2013-04-24 23:50:07
聲明你的線程函數是這樣的:'void * thr_qu(void * arg)'。像這樣創建它們:'pthread_create(&THR_QUEUE,NULL,thr_qu,&reparto)'。並且在thr_qu函數裏面做這個'int reparto = * arg;'但是你必須注意這樣做,因爲「&reparto」不能指向局部變量,除非它是靜態的。 – 2013-04-25 12:41:18