我正在创建一个实现抢占式循环调度程序的用户级线程库。我有这样的处理函数:
void handler(int signum)
{
gtthread_yield();
}
在gtthread_yield中,我正在进行上下文切换以切换到要执行的下一个线程。在大多数情况下,逻辑工作正常。但是,即使在gtthread_yield函数(从sighandler调用)完成执行之前,信号被引发时,我也会遇到分段错误。因此,我的代码访问了无效的内存位置(我已经释放的内存)
在gtthread_yield函数完成执行之前,有没有办法避免处理程序被引发?
由于
答案 0 :(得分:1)
使用sigaction()
及其助手(sigemptyset()
,sigfillset()
,sigaddset()
等)在处理程序正在进行时阻止信号。这可能是必要的一步;这可能还不够。如果还不够,您可能需要修改信号处理,以便在返回之前几乎不会发生volatile sig_atomic_t
变量。然后调用代码必须查看原子变量并在设置时调用gtthread_yield()
(记住在从gtthread_yield()
返回后清除变量。
答案 1 :(得分:0)
您可以阻止处理程序持续时间的其他信号,例如, this entry in glibc manual怎么做。