C 3ステップでマルチスレッドを実現

4197 ワード

Cマルチスレッドを使った良い文を見て、getという新しいスキルを見つけて、ついでに私が学んだポイントを書いて、みんなで共有しました.英文原文リンク:pthreads-in-c-a-minimal-working-example
Cでマルチスレッドを実現するには、最も簡単な方法はPthreadsを使用し、それを使用するとスレッド間でメモリとコードが共有されます.一方、呼び出された関数については、同時に複数回呼び出すことに相当します(関数内で定義された変数は共有されません).次に、クイックスタートを開始します.
ステップ1:宣言と定義
  • まずファイルヘッダにPthreadsライブラリを含む:
  • #include
  • これらのスレッドを指す変数を定義します.変数タイプはpthread_です.t,配列またはポインタ(ポインタでメモリを割り当てることを覚えている)を使用できる複数の
  • を定義すると.
     pthread_t thread0
  • スレッドを使用する関数を定義します.この関数のパラメータは(void*)タイプのパラメータを返し、(void*)タイプの変数があります.ここでは、この関数をvoid*my_と仮定します.entry_function(void *param);

  • ステップ2:スレッドの作成とマージ
  • 定義が完了すると、スレッドはpthread_を使用します.create関数を作成し、指定した関数に入ります.この関数には4つのパラメータがあり、1つ目は作成するスレッド変数の参照で、2つ目は属性(通常NULLを使用します)、3つ目はスレッドが実行する関数で、上記で定義したもので、4つ目は入力されたパラメータです.私たちが呼び出したコード長は
  • です.
     pthread_create(&thread0, NULL, my_entry_function, &parameter)
  • スレッドが指定した関数を実行した後、彼らの戻り値をマージする必要があります.このときjoin_を呼び出します.thread関数.この関数の最初のパラメータはスレッド変数として定義され、2番目のパラメータは戻り値を指すポインタ(なければNULL)
  • です.
     pthread_join(thread0, NULL);

    第3部:パラメータ付きのコンパイルの最後のステップは、コンパイル時にパラメータ-lpthreadを追加する必要があります.
    gcc program.c -o program -lpthread

    サンプルコードは次のとおりです.出力を推測できます.
    #include 
    #include 
    
    /* this function is run by the second thread */
    void *inc_x(void *x_void_ptr)
    {
    
    /* increment x to 100 */
    int *x_ptr = (int *)x_void_ptr;
    while(++(*x_ptr) < 100);
    
    printf("x increment finished
    "
    ); /* the function must return something - NULL will do */ return NULL; } int main() { int x = 0, y = 0; /* show the initial values of x and y */ printf("x: %d, y: %d
    "
    , x, y); /* this variable is our reference to the second thread */ pthread_t inc_x_thread; /* create a second thread which executes inc_x(&x) */ if(pthread_create(&inc_x_thread, NULL, inc_x, &x)) { fprintf(stderr, "Error creating thread
    "
    ); return 1; } /* increment y to 100 in the first thread */ while(++y < 100); printf("y increment finished
    "
    ); /* wait for the second thread to finish */ if(pthread_join(inc_x_thread, NULL)) { fprintf(stderr, "Error joining thread
    "
    ); return 2; } /* show the results - x is now 100 thanks to the second thread */ printf("x: %d, y: %d
    "
    , x, y); return 0; }

    output: x: 0, y:0 y increment finished x increment finished x: 100, y: 100