我有使用sigprocmask fn的多线程代码。据了解,在我理解的多线程程序中未指定此调用的使用,我将删除此调用。但是,我面临的问题是,如果调用此函数,主线程将被卡住。我想了解为什么会这样。如果对该函数的调用被注释掉,则主线程执行正常。
在初始化期间,在我的主程序中,几乎没有创建线程池。之后,我调用TestFunction函数,从中调用InitModule fn。在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中的其余代码始终会执行。只有当我返回到调用函数时,多数民众赞成在卡住的地方。
最佳答案
一些Linux线程库实现在内部使用线程在线程之间进行通信,以实现othread_ *函数。您正在尝试设置一个空的信号掩码。尝试将前三个实时信号留在那里。