我有一种情况,即在某些情况下,信号处理程序需要返回而不自己屏蔽,即在返回信号应保持阻塞在线程的信号屏蔽后。跳出longjmp
的信号处理程序将不起作用,因为我需要返回到像正常信号处理程序返回一样中断的确切点。是否有任何符合要求的方式来执行此操作,但使用从标准中删除的ucontext_t
?我不能更改信号处理程序或处置;所有的效果必须是线程本地的。从信号处理程序返回并将信号屏蔽
这段代码的目的是处理一些原子操作和潜在的竞态条件或死锁。基本上,可能中断代码如下所示:
atomic_write(&thread_local_flag, 1);
atomic_dec(&global_counter);
如果该标志已设置和计数器递减,一切都很好,信号处理程序无关,但信号可以在两个指令之间可能到达。在这种情况下,信号处理程序希望立即返回并让递减继续,但进程正在被信号轰炸(旨在被所有线程接收以实现神秘的同步目的),并且有可能永远循环(或在至少无限时间)处理信号,而其他线程永远不会收到它们的信号。
如果我可以让信号处理程序返回时阻塞信号,那就没有问题了。