从另一个线程中杀死一个帖子

时间:2013-04-24 18:43:59

标签: c pthreads kill

我有这个问题:

  • 如何从另一个线程中杀死一个线程(可能是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()。但它仍然无法正常工作,我不知道为什么

1 个答案:

答案 0 :(得分:3)

您可以使用pthread_cancel,但它只是对目标线程的请求,而不是强制终止。区分取消与其他形式的请求(例如通过条件变量传达的标志)的区别在于:

  1. 在某些标准库调用中,取消将自动执行,称为取消点,除非目标线程已明确暂停取消。

  2. 即使目标线程阻塞等待IO或某些可能永远无法完成的事件(在这种情况下,这是阻止它们的唯一方法),取消也可以工作。

  3. 要正确使用取消,您必须在每个资源分配级别或主要状态更改时使用使用pthread_cleanup_push,以确保在线程为空时撤消所有部分更改取消,或者您必须使用pthread_setcancelstate阻止取消,除非在某些地方可以安全地取消,只需很少或不需要清理工作。