我有这个问题:
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()
。但它仍然无法正常工作,我不知道为什么
答案 0 :(得分:3)
您可以使用pthread_cancel
,但它只是对目标线程的请求,而不是强制终止。区分取消与其他形式的请求(例如通过条件变量传达的标志)的区别在于:
在某些标准库调用中,取消将自动执行,称为取消点,除非目标线程已明确暂停取消。
即使目标线程阻塞等待IO或某些可能永远无法完成的事件(在这种情况下,这是阻止它们的唯一方法),取消也可以工作。
要正确使用取消,您必须在每个资源分配级别或主要状态更改时使用重使用pthread_cleanup_push
,以确保在线程为空时撤消所有部分更改取消,或者您必须使用pthread_setcancelstate
阻止取消,除非在某些地方可以安全地取消,只需很少或不需要清理工作。