sighandler中的问题

时间:2011-09-30 00:21:15

标签: c multithreading

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

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

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

在gtthread_yield函数完成执行之前,有没有办法避免处理程序被引发?

由于

2 个答案:

答案 0 :(得分:1)

使用sigaction()及其助手(sigemptyset()sigfillset()sigaddset()等)在处理程序正在进行时阻止信号。这可能是必要的一步;这可能还不够。如果还不够,您可能需要修改信号处理,以便在返回之前几乎不会发生volatile sig_atomic_t变量。然后调用代码必须查看原子变量并在设置时调用gtthread_yield()(记住在从gtthread_yield()返回后清除变量。

答案 1 :(得分:0)

您可以阻止处理程序持续时间的其他信号,例如, this entry in glibc manual怎么做。