嗨我要从一个地方跳到另一个地方..。
但是我想知道哪个更好,setjmp还是ucontext,比如:
<代码>F 211
请提供一些我想要的更多的信息,比如例子或者文档.
我在网络上搜索过,但我只有C语言中的异常处理,比如setjmp,我没有关于ucontex.h的任何信息。h,我知道它被用于多任务,它和线程有什么区别?
非常感谢。
发布于 2011-04-04 16:41:04
setjmp是可移植的(ISO C89和C99),ucontext (在SUSv3中过时并从SUSv4 4/POSIX 2008中删除)不是。然而,ucontext在规范方面要强大得多。实际上,如果您在setjmp/longjmp、信号处理程序和备用信号处理堆栈中使用了nasty,您可以使它们与ucontext一样强大,但它们并不是“可移植的”。
两者都不应用于多线程处理。为此目的,POSIX线程(p线程函数)。我有几个理由可以这样说:
如果您正在编写线程代码,那么最好让它实际并发运行。我们正在达到非并行计算的速度限制,未来的计算机将越来越多地并行,因此,利用that.
ucontext从标准中删除,可能在将来的OS中不受支持(甚至在某些当前的ones?)
发布于 2011-04-04 16:36:19
在可移植性方面,setjmp()可以移植到所有托管的C实现;<ucontext.h>函数是POSIX XSI扩展的一部分--这使得setjmp()更加可移植。
可以以线程安全的方式使用setjmp()。在线程程序中使用ucontext函数没有多大意义--您可以使用多个线程而不是多个上下文。
如果您想要快速地从嵌套的函数调用中返回,请使用setjmp() (这就是为什么您发现大多数示例都显示它用于异常处理)。使用ucontext函数实现用户空间线程或协同(或者根本不使用它们)。
“快速而安全”的问题毫无意义。实现的速度通常和实际的速度一样快,但是它们执行不同的功能,因此不能直接比较( ucontext函数做更多的工作,所以通常会稍微慢一些)。
注意,在POSIX的两个最新版本中,ucontext函数被列为过时函数。通常应该使用线程线程函数来代替。
发布于 2011-04-04 10:53:36
setjmp/longjmp只用于恢复“调用”上下文,因此只能用于从子程序链中执行“快速退出”。根据系统的不同,不同的用途可能起作用,也可能不起作用,但一般来说,这些功能并不打算做这种事情。所以"ucontext“更好。还可以查看“光纤”(Windows上的原生内容)。这里有一个链接,指向一篇可能有帮助的文章:
How to implement a practical fiber scheduler?
再见!
https://stackoverflow.com/questions/5536913
复制相似问题