2013-06-03 104 views
0

我正在研究Ubuntu 12.04.2 LTS。我有一個奇怪的問題pthread_kill()。在僅將標準輸出寫入"Create thread 0!"後,以下程序結束。該程序結束退出狀態138.pthread_kill結束呼叫程序

如果我取消註釋"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; 

} 

回答

1

如果主線程不提高SIGUSR1,爲創建最propably尚未建立線程信號處理程序之前睡了一下,所以用於接收信號的默認動作,這是結束處理。

使用sleep() s來同步線程不被推薦,因爲不保證是可靠的。在這裏使用其他機制。一個條件/互斥對將是合適的。

聲明全局狀態變量int signalhandlersetup = 0,由一個互斥保護訪問它,創建線程,讓使用pthread_cond_wait()主線程等待,讓創建的線程設置信號句柄SIGUSR1,設置signalhandlersetup = 0,然後打開信號條件主線程正在等待使用pthread_signal_cond()。最後,讓主線程調用pthread_kill(),就像你的發佈一樣。