嗨,我需要从一个地方跳到另一个地方......
但我想知道哪个更好用,setjmp或ucontext,比如:
请提供我要求的更多信息,例如示例或某些文档...
我在网上搜索过,但是我只在C语言中得到异常处理,就像setjmp的例子一样,我对ucontex.h一无所知,我得知它用于多任务,它与pthread的区别是什么?< / p>
非常感谢。
答案 0 :(得分:5)
setjmp
是可移植的(ISO C89和C99)和ucontext
(在SUSv3中过时并从SUSv4 / POSIX 2008中删除)不是。但是ucontext
在规范方面要强大得多。在实践中,如果您使用带有setjmp
/ longjmp
的令人讨厌的黑客和信号处理程序以及备用信号处理堆栈,您可以使它们与ucontext
一样强大,但它们不是“便携式” ”
两者都不应该用于多线程。为此目的POSIX线程(pthread函数)。我有几个理由说这个:
ucontext
已从标准中删除,未来的操作系统可能不受支持(甚至可能不支持某些操作系统?)答案 1 :(得分:0)
setjmp / longjmp仅用于恢复“调用”上下文,因此您只能将其用于从子例程链中“快速退出”。根据系统的不同,不同的用途可能有效,也可能无效,但通常这些功能不是为了做这种事情。所以“ucontext”更好。还要看看“光纤”(Windows上的原生)。这是指向可能有用的文章的链接:
How to implement a practical fiber scheduler?
再见!
答案 2 :(得分:0)
关于可移植性问题,setjmp()
可移植到所有托管的C实现; <ucontext.h>
函数是POSIX的XSI扩展的一部分 - 这使得setjmp()
更加便携。
可以以线程安全的方式使用setjmp()
。在线程程序中使用ucontext
函数没有多大意义 - 你可以使用多个线程而不是多个上下文。
如果要从深度嵌套的函数调用中快速返回,请使用setjmp()
(这就是为什么您发现大多数示例都显示其用于异常处理的原因)。使用ucontext
函数实现用户空间线程或协同程序(或根本不使用它们)。
“快速而安全”的问题毫无意义。实现通常与实现它们的速度一样快,但它们执行不同的功能,因此无法直接比较(ucontext
函数执行的工作更多,因此通常会稍微慢一些。)
请注意,ucontext
函数在两个最新版本的POSIX中列为过时。通常应该使用pthreads线程函数。