C 在sighandler发行
我正在创建一个实现抢占式循环调度程序的用户级线程库。我有如下处理函数:C 在sighandler发行,c,multithreading,C,Multithreading,我正在创建一个实现抢占式循环调度程序的用户级线程库。我有如下处理函数: void handler(int signum) { gtthread_yield(); } 在gtthread_yield中,我正在进行上下文切换,以切换到要执行的下一个线程。这种逻辑在大多数情况下都很有效。但是,当信号在gtthread_yield函数(从sighandler调用)完成执行之前发出时,我得到了一个分段错误。因此,我的代码访问无效的内存位置(我已经释放的内存) 有没有办法避免在gtthr
void handler(int signum)
{
gtthread_yield();
}
在gtthread_yield中,我正在进行上下文切换,以切换到要执行的下一个线程。这种逻辑在大多数情况下都很有效。但是,当信号在gtthread_yield函数(从sighandler调用)完成执行之前发出时,我得到了一个分段错误。因此,我的代码访问无效的内存位置(我已经释放的内存)
有没有办法避免在gtthread_yield函数完成执行之前引发处理程序
感谢您可以在处理程序持续期间阻止其他信号,请参见如何执行。使用及其帮助程序(
sigemptyset()
,sigfillset()
,sigaddset()
等)在处理程序进行期间阻止信号。这可能是一个必要的步骤;这可能还不够。如果这还不够,您可能需要修改信号处理,使其在返回之前除了一个volatile sig_atomic_t
变量之外几乎什么都不做。然后,调用代码必须查看原子变量,并在设置时调用gtthread\u yield()
(记住从gtthread\u yield()
返回后清除变量。什么是gtthread\u yield?它是异步信号安全的吗?不,它不是。它只是一个正常函数