2016-06-28 37 views
1

我嘗試着如何clone()在Linux中3.10.0-327.3.1.el7.x86_64段錯誤與克隆()和printf

我運行這段代碼並具有線程執行實驗偶爾會出現段錯誤。我知道如果我使用CLONE_THREAD,那麼無法檢查線程是否完成,但爲什麼printf會導致問題? Pthread庫如何處理這個問題?沒有printf s沒有段錯誤。

#define STACK_SIZE (1ULL<<22) //4MB 

int tmp = 10; 

int threadfunc(void *ptr) 
{ 
    printf("i'm here\n"); 
    tmp++; 
    return 0; 
} 

int main() 
{ 
    char *child_stack = malloc(STACK_SIZE); 
    int child_pid = clone(&threadfunc, child_stack+(STACK_SIZE)-1, CLONE_THREAD|CLONE_SIGHAND|CLONE_VM|CLONE_FS|CLONE_FILES|SIGCHLD, NULL); 

    printf("my pid: %d\n", getpid()); 
    printf("child pid: %d\n", child_pid); 
    printf("tmp is: %d\n", val); 

    return 0; 
} 
+1

正確使用clone()會很棘手。 99%的時間你想'fork()'或'pthread_create()'而不是。 –

回答

1

printf功能不明白,它被稱爲在clone 任務;它是圍繞glibc pthread庫設計的。

你在做什麼類似於用異步信號中斷printf,並從信號中重新輸入printf

庫如何處理問題是它使用clone作爲更復雜的線程實現的一部分,它使用線程標識「克隆」克隆的任務。此線程標識允許printf鎖定流操作周圍的互斥鎖。

什麼是線程身份?這意味着C庫中的線程相關函數可以以某種方式查詢「哪個線程正在調用我?」以獲得映射到線程描述符結構的ID。單獨使用clone函數不會設置此標識。