2011-09-30 60 views
-1

我正在创建一个实现抢先式循环调度程序的用户级线程库。我有这样的处理函数:sighandler中的问题

void handler(int signum) 
{ 
    gtthread_yield(); 
} 

在gtthread_yield中,我正在做上下文切换切换到下一个要执行的线程。该逻辑在大多数情况下工作正常。但是,即使在gtthread_yield函数(从sighandler调用)可以完成执行之前,信号仍然出现时,我会遇到分段错误。正因为如此,我的访问代码(即我已经释放的内存)无效的内存位置

有什么办法避免处理程序gtthread_yield功能执行完毕之前被提出?

由于

+0

什么gtthread_yield?是异步信号安全? – Kevin

+0

不,它不是,它只是一个正常的功能 – CuriousCoder

回答

1

使用sigaction()及其帮助程序(sigemptyset(),sigfillset(),sigaddset()等)在处理程序正在进行时阻止信号。这可能是一个必要的步骤;这可能是不够的。如果不够用,您可能需要修改信号处理,以便在返回之前除了变量volatile sig_atomic_t之外几乎什么也不做。然后调用代码已经看原子变量,并调用gtthread_yield()当设置(记住从gtthread_yield()返回后清除变量。