Я пытался реализовать библиотеку потоков пользовательского уровня, используя функции makecontext()
, swapcontext()
и getcontext()
.Я читал, что хорошей практикой является использование сигналов для функции расписания (с циклическим таймером), но пока добавляется новый поток, блокируйте сигналы.
Моя проблема заключается в следующем: я могу реализовать функцию для блокировкисигналы, но это не работает, когда я использую переключение контекста.
void initSignals()
{
printf("initSignals\n");
act.sa_handler = schedule;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
sigaction(SIGALRM, &act, &oact);
}
void blockSignals()
{
printf("blockSignals\n");
//sigset_t sig_mask;
sigemptyset(&sig_mask);
sigaddset(&sig_mask, SIGALRM);
sigprocmask(SIG_BLOCK, &sig_mask, NULL);
}
void unblockSignals()
{
printf("unblockSignals\n");
//sigset_t sig_mask;
sigemptyset(&sig_mask);
sigaddset(&sig_mask, SIGALRM);
sigprocmask(SIG_UNBLOCK, &sig_mask, NULL);
runTimer();
}
О sigset_t sig mask
теперь это глобально, но я попытался установить его как локальную переменную тоже.Кроме того, я попытался использовать другие сигналы SIGPROF, SIGVTALRM
, потому что мой циклический таймер выглядит так:
void runTimer()
{
printf("runTimer\n");
it.it_interval.tv_sec = 1;
it.it_interval.tv_usec = 0;
it.it_value.tv_sec = 1;
it.it_value.tv_usec = 0;
setitimer(ITIMER_REAL, &it, NULL);
}
И itimer позволяет использовать эти 3 типа тревоги ...
Так что вопрос: как блокировать сигналы, когда код использует функции переключения контекста?Является ли это возможным?Может быть, существуют другие функции, которые могут это сделать?
Я думал, что сигналы используются для всех процессов, поэтому я удивился, что он не работает ...