sigprocmask, приводящий к зависанию основного процесса

У меня есть многопоточный код, который использовал 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.....

}

Если я удаляю вызов sigprocmask() из InitModule, я получаю печать "DoSomethingElse done". Как использование sigprocmask приводит к зависанию потока?

Обратите внимание, что остальная часть кода в InitModule после вызова этого fn всегда выполняется. Только когда я вернусь к вызывающей функции, вот где она застревает.

1 ответ

Некоторые реализации потоковых библиотек Linux используют потоки для связи между потоками для реализации функций othread_*. Вы пытаетесь установить пустую маску сигнала. Попробуйте оставить там первые 3 сигнала в реальном времени.

Другие вопросы по тегам