0

我有使用 sigprocmask fn 的多线程代码。众所周知,在我理解的多线程程序中未指定此调用的使用,我将删除此调用。但是,我面临的问题是,如果调用此函数,我的主线程就会卡住。我想了解为什么会发生这种情况。如果对该函数的调用被注释掉,则主线程执行良好。

在初始化期间的主程序中,创建的线程池很少。之后,我调用了调用 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 done”打印。sigprocmask 的使用如何导致线程卡住?

请注意,调用此 fn 后 InitModule 中的其余代码始终会执行。只有当我返回调用函数时,它才会卡住。

4

1 回答 1

0

一些 Linux 线程库实现在内部使用线程在线程之间进行通信以实现 othread_* 函数。您正在尝试设置一个空的信号掩码。尝试将前 3 个实时信号留在那里。

于 2011-08-24T12:20:52.873 回答