4

私は C プログラミングでコンテキスト切り替えを勉強していて、インターネットで次のサンプル コードを見つけました。makecontext()関数だけが何かを実行する関数をトリガーできるかどうかを把握しようとしています。setcontext()getcontext()、などの他の関数swapcontext()は、コンテキストの設定に使用されます。

関数とそのmakecontext()パラメータをコンテキストにアタッチします。変更がコミットされるまで、関数は常にコンテキストに固執しますか?

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <ucontext.h>
  4 #define MEM 64000
  5 
  6 ucontext_t T1, T2, Main;
  7 ucontext_t a;
  8 
  9 int fn1()
 10 {
 11   printf("this is from 1\n");
 12   setcontext(&Main);
 13 }
 14 
 15 void fn2()
 16 {
 17   printf("this is from 2\n");
 18   setcontext(&a);
 19   printf("finished 1\n");
 20 }
 21 
 22 void start()
 23 {
 24   getcontext(&a);
 25   a.uc_link=0;
 26   a.uc_stack.ss_sp=malloc(MEM);
 27   a.uc_stack.ss_size=MEM;
 28   a.uc_stack.ss_flags=0;
 29   makecontext(&a, (void*)&fn1, 0);
 30 }
 31 
 32 int main(int argc, char *argv[])
 33 {
 34   start();
 35   getcontext(&Main);
 36   getcontext(&T1);
 37   T1.uc_link=0;
 38   T1.uc_stack.ss_sp=malloc(MEM);
 39   T1.uc_stack.ss_size=MEM;
 40   makecontext(&T1, (void*)&fn1, 0);
 41   swapcontext(&Main, &T1);
 42   getcontext(&T2);
 43   T2.uc_link=0;
 44   T2.uc_stack.ss_sp=malloc(MEM);
 45   T2.uc_stack.ss_size=MEM;
 46   T2.uc_stack.ss_flags=0;
 47   makecontext(&T2, (void*)&fn2, 0);
 48   swapcontext(&Main, &T2);
 49   printf("completed\n");
 50   exit(0);
 51 }
4

1 に答える 1

10

makecontext関数情報をコンテキストに書き込み、他の何かによって上書きされるまでそこに残ります。 getcontextはコンテキスト全体を上書きするため、前の への呼び出しによってそこに記述された関数を上書きしますmakecontext。同様に、swapcontext最初の引数が指すコンテキストを完全に上書きします。

基本的な考え方は、u_contextある時点でのプロセス コンテキストの一部のスナップショットが含まれているということです。すべてのマシン レジスタ、スタック情報、およびシグナル マスクが含まれています。メモリ マップまたはファイル記述子の状態は含まれません。の状態は、u_contextスレッドまたはコルーチンを実装するために操作する必要があるすべての状態です。

編集

swapcontext(&current, &another)現在のコンテキストを に保存し、currentに切り替えますanother。後で、コード (コンテキストから実行されている) が(別の呼び出しで)anotherに戻るか、3 番目のコンテキストに切り替わる可能性があります。コンテキストが終了すると (戻り値で設定された関数)、そのフィールドが何らかのコンテキストを指している場合、そのコンテキストに切り替わります。しかし、NULL の場合、スレッド (およびスレッドが 1 つしかない場合はプロセス) は終了します。実行されていない他のコンテキストは放棄されます。currentswapcontextmakecontextuc_linkuc_link

于 2014-01-31T01:55:47.873 に答える