2011-08-24 41 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个实时信号。