我正在创建一个用户级线程库,实现抢占式循环调度程序。我有这样的处理函数:
void handler(int signum)
{
gtthread_yield();
}
在gtthread_yield中,我正在进行上下文切换以切换到下一个要执行的线程。在大多数情况下,逻辑工作得很好。但是,即使在 gtthread_yield 函数(从ighandler 调用)完成执行之前发出信号,我也会遇到段错误。因此,我的代码访问无效的内存位置(我已经释放的内存)
是否有任何方法可以避免在 gtthread_yield 函数完成执行之前引发处理程序?
谢谢
最佳答案
使用sigaction()
及其助手(sigemptyset()
、sigfillset()
、sigaddset()
等)在处理程序正在进行时阻止信号。这可能是必要的一步;这可能还不够。如果这还不够,您可能需要修改信号处理,以便它在返回之前除了 volatile sig_atomic_t 变量之外几乎不执行任何操作。然后,调用代码必须查看原子变量,并在设置时调用 gtthread_yield()
(记住从 gtthread_yield()
返回后清除该变量。
关于c - sighandler 中的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7604771/