<ucontext.h>不推荐使用用户线程函数,因为它们使用不推荐的C 函数(它们使用带有空括号的函数声明作为参数).
它们有标准替代品吗?我不认为成熟的线程擅长实现协作线程.
从问题:
其中两条评论说:
"你不能在信号处理程序中抛出异常,但你可以安全地做一个longjmp - 只要你知道你在做什么. - Dietrich Epp 8月31日19:57 @Dietrich:+1你的评论.这是一个鲜为人知且完全不被重视的事实.在不使用信号处理程序的longjmp的情况下,有许多问题无法解决(令人讨厌的竞争条件).阻塞系统调用的异步中断是典型的例子."
我的印象是内核在遇到异常情况时调用信号处理程序(例如除以0).此外,如果您专门注册它们,它们只会被调用.
这似乎意味着(对我来说)它们不会通过您的正常代码调用.
继续这个想法...我理解的是setjmp和longjmp用于将堆栈折叠到先前的点和状态.我不明白在调用信号处理程序时如何折叠堆栈,因为它从内核调用作为一次性环境而不是从您自己的代码调用.从信号处理程序到堆栈的下一个东西是什么!?