0

我有这个问题:

  • 如何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(). 但它仍然无法正常工作,我不知道为什么

4

1 回答 1

3

你可以使用pthread_cancel,但它只是对目标线程的请求,而不是强行杀死。取消与其他形式的请求(例如通过条件变量通信的标志)的区别在于:

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

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

要正确使用取消,您必须在每个级别的资源分配或主要状态更改上大量使用pthread_cleanup_push以确保在取消线程时撤消所有部分更改,或者您必须pthread_setcancelstate在某些点阻止取消只需很少或根本不需要清理工作,就可以安全地对取消采取行动。

于 2013-04-24T19:38:30.160 回答