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 сигнала в реальном времени.