0

この質問があります:

  • pthread_cancel()別のスレッドから(おそらく) スレッドを強制終了するにはどうすればよいですか?

これがサンプルコードです。1 を押すと、他のスレッドが強制終了される必要があります。(他のスレッドに a を入れずに、1 つのスレッドから kill を強制する必要があり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が、それはターゲット スレッドへの要求であり、強制的な kill ではありません。条件変数を介して伝達されるフラグなど、他の形式のリクエストとキャンセルを区別するものは次のとおりです。

  1. キャンセルは、キャンセル ポイントと呼ばれる特定の標準ライブラリ呼び出しで自動的に実行されます。

  2. キャンセルは、ターゲット スレッドがIO または完了しない可能性のある他の特定のイベントを待機してブロックされている場合でも機能します (この場合、それらを停止する唯一の方法です)。

キャンセルを正しく使用するには、スレッドがキャンセルされたときにすべての部分的な変更が確実に取り消されるように、リソース割り当てまたは主要な状態変更の各レベルで大量に使用するか、特定のポイントを除いてキャンセルをブロックする必要があります。クリーンアップの労力がほとんどまたはまったくなくても、キャンセルに安全に対処できます。pthread_cleanup_pushpthread_setcancelstate

于 2013-04-24T19:38:30.160 に答える