嗨,我需要从一个地方跳到另一个地方...

但我想知道哪个更好用,setjmp 或 ucontext,例如:

  • setjmp 和 ucontext 是否可移植?
  • 我的代码使用这些库是线程安全的吗?
  • 为什么用一个而不是另一个?
  • 哪个又快又安全?
  • ...(有人可以回答我忘记放在这里的 future 问题吗?)

  • 请提供更多我要求的信息,例如示例或一些文档...

    我在网上搜索过,但我只有像setjmp这样的C中的异常处理,而我对ucontex.h一无所知,我知道它用于多任务,它和pthread有什么区别?

    非常感谢。

    最佳答案

    setjmp 是可移植的(ISO C89 和 C99),而 ucontext(在 SUSv3 中已过时并从 SUSv4/POSIX 2008 中删除)不是。然而 ucontext 在规范中要强大得多。在实践中,如果你对 setjmp/longjmp 和信号处理程序以及备用信号处理堆栈使用讨厌的黑客,你可以使它们与 ucontext 一样强大,但它们不是“可移植的”。

    两者都不应用于多线程。为此,POSIX 线程(pthread 函数)。我有几个理由这么说:

  • 如果您正在编写线程代码,您不妨让它真正并发运行。我们正在达到非并行计算的速度限制, future 的机器将越来越并行,因此请充分利用这一点。
  • ucontext 已从标准中删除, future 的操作系统(或什至一些现有的操作系​​统)可能不支持
  • 滚动您自己的线程不能对您可能想要使用的库代码透明。它可能会破坏对并发、锁定等做出合理假设的库代码。 只要您的多线程是协作的而不是基于异步信号的,这样的问题可能不会太多,但是一旦您深入了解不可移植hacks 的东西会变得非常脆弱。
  • ...也许还有更多我现在想不出来的原因。 :-)
  • 关于C setjmp.h 和 ucontext.h,哪个更好?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5536913/

    10-12 17:46