Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C/C++のスレッド関数とは?pthreadによる並行処理の基本を解説

このチュートリアルでは、C/C++におけるスレッド関数の基本的な使い方を、実際のサンプルプログラムを通じて解説します。

スレッド関数を利用すると、複数の処理を同時(並行)に実行できます。これらの処理は互いに依存し合っていても、まったく独立していてもどちらでも構いません。POSIXスレッド(pthread)ライブラリを使えば、マルチスレッドプログラミングを手軽に実装できます。

サンプルコード

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

void* func(void* arg){
    // 現在のスレッドをデタッチ(切り離し)する
    pthread_detach(pthread_self());
    printf("Inside the thread\n");
    pthread_exit(NULL);
}

void fun(){
    pthread_t ptid;
    // 新しいスレッドを作成する
    pthread_create(&ptid, NULL, &func, NULL);
    printf("This line may be printed before thread terminates\n");
    if(pthread_equal(ptid, pthread_self()))
        printf("Threads are equal\n");
    else
        printf("Threads are not equal\n");
    // 作成したスレッドの終了を待機する
    pthread_join(ptid, NULL);
    printf("This line will be printed" " after thread ends\n");
    pthread_exit(NULL);
}

int main(){
    fun();
    return 0;
}

実行結果

This line may be printed before thread terminates
Threads are not equal
Inside the thread
This line will be printed after thread ends

コードのポイント

pthread_create():スレッドの生成

新しいスレッドを生成します。第1引数にはスレッドIDを受け取る変数へのポインタ、第2引数にはスレッド属性、第3引数にはスレッド上で実行する関数、第4引数にはその関数へ渡す引数を指定します。

pthread_detach():スレッドの切り離し

現在のスレッドをデタッチ状態にします。デタッチされたスレッドは終了時に自動的にリソースが解放されるため、他のスレッドからjoinする必要がなくなります。

pthread_equal():スレッドIDの比較

2つのスレッドIDが同一かどうかを判定します。この例では、新しく作成したスレッドと呼び出し元のスレッドは別物なので、「Threads are not equal」と表示されます。

pthread_join():スレッドの終了待ち

指定したスレッドの終了を待機します。これにより、呼び出し元の処理は対象スレッドが完了するまでブロックされます。

pthread_exit():スレッドの終了

呼び出し元のスレッドを終了させます。NULLを渡すことで、戻り値なしでスレッドを終了できます。

まとめ

pthreadライブラリを使えば、スレッドの生成・待機・比較・終了といった一連の操作をシンプルなAPIで実現できます。ただし、実行結果からも分かるように、スレッド生成後の処理順序はOSのスケジューリングに依存するため、出力の順番が環境によって変わる可能性がある点には注意が必要です。

  1. C/C++のスレッド関数とは?pthreadによる並行処理の基本を解説

    このチュートリアルでは、C/C++におけるスレッド関数の基本的な使い方を、実際のサンプルプログラムを通じて解説します。 スレッド関数を利用すると、複数の処理を同時(並行)に実行できます。これらの処理は互いに依存し合っていても、まったく独立していてもどちらでも構いません。POSIXスレッド(pthread)ライブラリを使えば、マルチスレッドプログラミングを手軽に実装できます。 サンプルコード #include <pthread.h> #include <stdio.h> #include <stdlib.h> void* func(void* arg){

  2. C/C++で学ぶAA木(AA Tree)とは?基本概念と平衡化操作を徹底解説

    AA木(AA Tree)とはコンピュータサイエンスにおいて、AA木(AA Tree)とは、順序付きデータを効率的に格納・検索するために実装された平衡木(バランスドツリー)の一種です。AA木は、赤黒木(Red-Black Tree)の変種として扱われます。赤黒木は二分探索木の一形態であり、要素の追加や削除を効率的にサポートします。赤黒木と大きく異なる点は、AA木では赤いノードを右の子としてのみ追加でき、左の子としては配置できないという制約があることです。この制約により、2-3-4木ではなく2-3木をシミュレートすることになり、その結果、木の保守操作が大幅に簡素化されます。赤黒木の平衡化アルゴリズ