0

私はUbuntu 12.04.2 LTSに取り組んでいます。に奇妙な問題がありpthread_kill()ます。"Create thread 0!"次のプログラムは、標準出力のみに書き込んで終了します。プログラムは終了ステータス 138 で終了します。

コメントを外すと"usleep(1000);"、すべてが正しく実行されます。なぜこれが起こるのでしょうか?

#include <nslib.h>

void *testthread(void *arg);

int main() {

    pthread_t tid[10];
    int i;

    for(i = 0; i < 10; ++i) {
        printf("Create thread %d!\n", i);
        Pthread_create(&tid[i], testthread, NULL);
        //usleep(1000);
        Pthread_kill(tid[i], SIGUSR1);
        printf("Joining thread %d!\n", i);
        Pthread_join(tid[i]);
        printf("Joined %d!", i);
    }

    return 0;
}

void sighandlertest(int sig) {

    printf("print\n");
    pthread_exit();
    //return NULL;

}

void* testthread(void *arg) {

    struct sigaction saction;

    memset(&saction, 0, sizeof(struct sigaction));
    saction.sa_handler = &sighandlertest;
    if(sigaction(SIGUSR1, &saction, NULL) != 0 ) {
        fprintf(stderr, "Sigaction failed!\n");
    }
    printf("Starting while...\n");
    while(true) {

    }

    return 0;

}
4

1 に答える 1

1

を発生させる前にメイン スレッドが少しスリープしない場合、SIGUSR1作成されたスレッドのシグナル ハンドラが設定されていない可能性が最も高いため、シグナルを受信するためのデフォルト アクションが適用され、プロセスが終了します。

s を使用sleep()してスレッドを同期することは、信頼性が保証されていないため推奨されません。ここで他のメカニズムを使用します。条件/ミューテックスのペアが適しています。

グローバル状態変数int signalhandlersetup = 0を宣言し、ミューテックスによるアクセスを保護し、スレッドを作成し、メインスレッドを を使用して待機pthread_cond_wait()させ、作成されたスレッドに のシグナルハンドルを設定させSIGUSR1signalhandlersetup = 0メインスレッドが待機している状態を を使用して設定し、通知しpthread_signal_cond()ます。pthread_kill()最後に、投稿のようにメインスレッドを呼び出します。

于 2013-06-03T11:16:26.960 に答える