2011-08-24 44 views
0

我有使用sigprocmask fn的多線程代碼。它已知在多線程程序中未指定使用此調用,我明白,我將刪除此調用。但是,我面臨的問題是,如果調用此函數,我的主線程會卡住。我想明白爲什麼會發生這種情況。如果對這個函數的調用被註釋掉了,那麼主線程執行正常。sigprocmask導致主進程卡住

在Init中的主程序中,很少創建線程池。之後,我調用InitModule fn所調用的TestFunction函數。在InitModule中,調用sigprocmask,然後完成其他初始化。該函數然後返回到TestFunction。這是它卡住的地方。

的用法如下

InitModule() 
{ 
    sigset_t x; 
    sigemptyset (&x); 
    sigprocmask(SIG_SETMASK, &x, NULL) 

    // Config read, DS Init, etc .... 

} 

TestFunction() 
{ 

    // Code 

    InitModule(); 
    malloc(); 
    printf("malloc done"); // --> This line is printed 
    DoSomethingElse(); 

    printf("DoSomethingElse done");// --> Never reaches this point. 


    // .... Remaining code..... 

} 

如果我從InitModule刪除sigprocmask()執行調用,然後我得到 「DoSomethingElse完成」 打印。 sigprocmask的用法如何導致線程卡住?

請注意,調用此fn後,InitModule中的其餘代碼始終執行。只有當我返回到調用函數,那是它卡住了。

回答

0

一些Linux線程庫實現在內部使用線程來在線程之間進行通信以實現othread_ *函數。您正嘗試設置一個空信號掩碼。嘗試離開那裏的前3個實時信號。