4

Hi I'm need to jump from a place to another...

But I would like to know which is better to use, setjmp or ucontext, things like:

  • Are setjmp and ucontext portable?
  • My code is thread safe using these library?
  • Why use one instead another?
  • Which is fast and secure?
  • ...(Someone please, can answer future question that I forgot to put here?)

Please give a little more information that I'm asking for, like examples or some docs...

I had searching on the web, but I only got exception handling in C like example of setjmp, and I got nothing about ucontex.h, I got that it was used for multitask, what's the difference of it and pthread?

Thanks a lot.

4

3 に答える 3

5

setjmp移植可能 (ISO C89 および C99) ですがucontext(SUSv3 では廃止され、SUSv4/POSIX 2008 から削除されました) 移植性はありません。しかしucontext、仕様ではかなり強力でした。実際には、setjmp/longjmpおよびシグナル ハンドラと別のシグナル処理スタックで厄介なハックを使用すると、これらを とほぼ同じくらい強力にすることができますが、ucontext「移植可能」ではありませんでした。

どちらもマルチスレッドには使用しないでください。そのためには、POSIX スレッド (pthread 関数) を使用します。私がこれを言うのにはいくつかの理由があります:

  • スレッド化されたコードを作成している場合は、実際に同時に実行することもできます。非並列コンピューティングの速度限界に達しつつあり、将来のマシンはますます並列化されるため、それを利用してください。
  • ucontext標準から削除され、将来の OS (またはいくつかの現在のものでさえ?) でサポートされない可能性があります。
  • 独自のスレッドのローリングは、使用する可能性のあるライブラリ コードに対して透過的にすることはできません。同時実行性、ロックなどについて合理的な仮定を行うライブラリ コードが壊れる可能性があります。マルチスレッドが非同期シグナル ベースではなく協調的である限り、このような問題はおそらくあまり多くありませんが、非移植性にこれほど深く関わっていれば、ハックしたものは非常に壊れやすくなります。
  • ...そしておそらく、今は思いつかない理由がいくつかあります。:-)
于 2011-04-04T16:41:04.077 に答える
1

移植性の問題についてsetjmp()は、ホストされているすべての C 実装に移植可能です。<ucontext.h>関数は POSIX の XSI 拡張機能の一部です。これにより、setjmp()移植性が大幅に向上します。

setjmp()スレッドセーフな方法で使用することが可能です。スレッド化されたプログラムで関数を使用してもあまり意味がありませんucontext。複数のコンテキストではなく、複数のスレッドを使用することになります。

setjmp()深くネストされた関数呼び出しからすばやく戻りたい場合に使用します (これが、ほとんどの例で例外処理への使用が示されている理由です)。ユーザー空間のスレッドまたはコルーチンを実装するために関数を使用しucontextます (またはまったく使用しないでください)。

「高速で安全」という質問には意味がありません。実装は通常、実際に作成できるほど高速ですが、異なる機能を実行するため、直接比較することはできません (ucontext機能はより多くの作業を行うため、通常はわずかに遅くなります)。

ucontext関数は、POSIX の最新の 2 つの版では廃止予定としてリストされていることに注意してください。通常は、代わりに pthreads スレッド化関数を使用する必要があります。

于 2011-04-04T16:36:19.393 に答える
0

setjmp/longjmp は、「呼び出し」コンテキストを復元することのみを目的としているため、サブルーチンのチェーンから「高速終了」を行うためだけに使用できます。システムによって異なる用途が機能する場合と機能しない場合がありますが、一般に、これらの関数はこの種のことを行うことを意図していません。したがって、「ucontext」の方が優れています。「ファイバー」(Windows ネイティブ) も参照してください。役に立つかもしれない記事へのリンクは次のとおりです。

実用的なファイバースケジューラーを実装するには?

さよなら!

于 2011-04-04T10:53:36.947 に答える