Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在sighandler发行_C_Multithreading - Fatal编程技术网

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?它是异步信号安全的吗?不,它不是。它只是一个正常函数