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

C言語のpthread_equal()関数の使い方を徹底解説

pthread_equal()関数とは

pthread_equal()関数は、POSIXスレッド(pthread)ライブラリに含まれる関数の一つで、2つのスレッドが同一であるかどうかを判定するために使用されます。戻り値は0または非ゼロの値で、2つのスレッドが等しい場合は非ゼロの値を、等しくない場合は0を返します。

なお、スレッドID(pthread_t型)の比較には「==」演算子ではなく、必ずこのpthread_equal()関数を使用することが推奨されています。これは、pthread_t型の内部構造が処理系によって異なるため、移植性の高いコードを書くためです。

構文

pthread_equal()関数の構文は以下のとおりです。

int pthread_equal(pthread_t th1, pthread_t th2);

引数には、比較対象となる2つのスレッドID(th1とth2)を指定します。

使用例1:自分自身のスレッドとの比較

それでは、pthread_equal()の実際の動作を確認してみましょう。最初の例では、実行中のスレッド自身と比較して、結果がどうなるかを見ていきます。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <pthread.h>

pthread_t sample_thread;

void* my_thread_function(void* p) {
    if (pthread_equal(sample_thread, pthread_self())) { // pthread_self()は現在のスレッドIDを返す
        printf("Threads are equal\n");
    } else {
        printf("Threads are not equal\n");
    }
}

int main() {
    pthread_t th1;
    sample_thread = th1; // スレッドth1を別のスレッドオブジェクトに代入
    pthread_create(&th1, NULL, my_thread_function, NULL); // my_thread_functionを使ってスレッドを生成
    pthread_join(th1, NULL); // メインスレッドとの合流を待機
    return 0;
}

実行結果

Threads are equal

この例では、グローバル変数sample_threadにスレッドth1の値が代入されているため、スレッド関数内でpthread_self()が返すスレッドIDと一致し、「Threads are equal」と出力されます。

使用例2:異なるスレッド同士の比較

次に、異なる2つのスレッドを比較した場合に、どのような結果になるかを確認してみましょう。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <pthread.h>

pthread_t sample_thread;

void* my_thread_function1(void* ptr) {
    sample_thread = pthread_self(); // スレッド1のIDを代入
}

void* my_thread_function2(void* p) {
    if (pthread_equal(sample_thread, pthread_self())) { // pthread_self()は現在のスレッドIDを返す
        printf("Threads are equal\n");
    } else {
        printf("Threads are not equal\n");
    }
}

int main() {
    pthread_t th1, th2;
    pthread_create(&th1, NULL, my_thread_function1, NULL); // my_thread_function1でスレッドを生成
    pthread_create(&th2, NULL, my_thread_function2, NULL); // my_thread_function2でスレッドを生成
    pthread_join(th1, NULL); // メインスレッドとの合流を待機
    pthread_join(th2, NULL);
    return 0;
}

実行結果

Threads are not equal

この例では、スレッド1のIDがsample_threadに格納され、スレッド2の実行時にpthread_self()が返すのはスレッド2自身のIDです。両者は異なるスレッドであるため、「Threads are not equal」と出力されます。

コンパイル時の注意点

pthreadライブラリを使用するプログラムをコンパイルする際は、GCCの場合など、リンクオプションとして「-lpthread」を指定する必要があります。

gcc sample.c -o sample -lpthread

まとめ

pthread_equal()関数を使用すると、2つのスレッドIDが同一かどうかを簡単に判定できます。スレッドが等しい場合は非ゼロの値を、異なる場合は0を返します。pthread_t型の比較には「==」演算子ではなく、必ずpthread_equal()関数を使うことで、移植性の高いマルチスレッドプログラムを書くことができます。

  1. C#でスレッドの優先度を表示する方法|Priorityプロパティの使い方

    C#でスレッドの優先度を表示するには C#でスレッドの優先度を確認するには、Priorityプロパティを使用します。このプロパティは、OSがスレッドをどの程度の優先順位でスケジューリングするかを示す値を返します。 まず、CurrentThreadプロパティを使って、現在実行中のスレッドの情報を取得します。 Thread thread = Thread.CurrentThread; 次に、thread.Priorityプロパティを参照することで、そのスレッドの優先度を表示できます。 thread.Priority サンプルコード C#でスレッドの優先度を表示する完全なコード例を見てみましょう。

  2. Javaのスレッドプールとは?仕組みと実装例をわかりやすく解説

    スレッドプールとはスレッドプール(Thread Pool)とは、あらかじめ初期化された複数のスレッドをまとめて管理する仕組みのことです。基本的な考え方は、アプリケーションの起動時に一定数のスレッドを作成してプールに入れておき、それらのスレッドが仕事を待機するというものです。サーバーがリクエストを受け取ると、利用可能なスレッドがあればプールから1つ取り出して処理を任せます。スレッドはタスクの完了後、破棄されることなくプールへ戻り、次の仕事を待ちます。もしプール内に空きスレッドが存在しない場合は、空きができるまでサーバー側で待機することになります。スレッドプールのメリットタスクごとに新しいスレッド