sigprocmask, приводящий к зависанию основного процесса - PullRequest
0 голосов
/ 24 августа 2011

У меня есть многопоточный код, который использовал sigprocmask fn. Известно, что использование этого вызова не определено в многопоточной программе, которую я понимаю, и я удалю этот вызов. Однако проблема, с которой я сталкиваюсь, заключается в том, что мой основной поток застревает, если эта функция вызывается. Я хочу понять, почему это происходит. Если вызов этой функции закомментирован, то основной поток выполняется нормально.

В моей основной программе во время Init создано несколько пулов потоков. После этого я вызываю функцию 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 Ответ

0 голосов
/ 24 августа 2011

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

...