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

C言語でマルチスレッドを活用した線形検索の実装方法

ここでは、配列内の特定の要素を検索する際に、マルチスレッドの概念をどのように応用できるかを解説します。アプローチは非常にシンプルです。まず複数のスレッドを作成し、配列をいくつかの部分に分割します。そして、それぞれのスレッドが担当範囲の検索を行い、目的の要素が見つかった時点でフラグを立てて識別できるようにします。

サンプルコード

#include <stdio.h>
#include <pthread.h>
#define MAX 16
#define THREAD_MAX 4
int array[MAX] = { 1, 5, 7, 10, 12, 14, 15, 18, 20, 22, 25, 27, 30, 64, 110, 220 };
int key = 18;
int flag = 0; // 要素が見つかったかどうかを示すフラグ
int current_thread = 0;
void* ThreadSearch(void* args) { // 全スレッドで実行される線形検索関数
    int num = current_thread++;
    for (int i = num * (MAX / 4); i < ((num + 1) * (MAX / 4)); i++){
       if (array[i] == key)
          flag = 1; // キーが見つかったらフラグをセット
    }
}
int main() {
    pthread_t thread[THREAD_MAX];
    for (int i = 0; i < THREAD_MAX; i++) { // 複数のスレッドを作成
       pthread_create(&thread[i], NULL, ThreadSearch, (void*)NULL);
    }
    for (int i = 0; i < THREAD_MAX; i++) {
       pthread_join(thread[i], NULL); // すべてのスレッドが完了するまで待機
    }
    if (flag == 1)
       printf("Key element is found\n");
    else
       printf("Key element is not present\n");
}

実行結果

$ gcc 1249.Thread_search.cpp -lpthread
$ ./a.out
Key element is found

プログラムの仕組み

このプログラムでは、16個の要素を持つ配列を4つのスレッドで並行して検索しています。各スレッドは current_thread 変数をインクリメントしながら自身の担当番号を取得し、配列を4等分したうちの1区間(4要素ずつ)を担当します。

POSIXスレッド(pthread)ライブラリを使用しており、pthread_create() でスレッドを生成し、pthread_join() ですべてのスレッドの処理完了を待ち合わせます。全スレッドの終了後、フラグ変数 flag の値を確認することで、キーとなる要素が配列内に存在するかどうかを判定しています。

なお、大規模なデータを扱う場合、このように検索処理を複数のスレッドに分散させることで、シングルスレッドでの線形検索と比べて処理時間を短縮できる可能性があります。

  1. Pythonで学ぶ線形探索(リニアサーチ)の基本と実装方法

    この記事では、最も基本的な検索アルゴリズムの一つである「線形探索(Linear Search)」の仕組みを理解し、Python 3.xでの実装方法をわかりやすく解説します。 線形探索のアルゴリズム 配列 arr[] の左端の要素から順に、目的の要素 x と各要素を一つずつ比較していきます x がいずれかの要素と一致した場合、そのインデックス(位置)を返します x が配列内のどの要素とも一致しなかった場合、-1 を返すか「要素が見つからない」ことを示します それでは、このアプローチの流れを視覚的に確認してみましょう。 実装例 def linearsearch(arr, x):

  2. PyTorchを使った線形回帰の実装方法を徹底解説

    線形回帰とは 単純線形回帰の基礎 2つの連続変数の間にある関係性を把握するために用いられる手法です。 具体例: x = 独立変数(例:体重) y = 従属変数(例:身長) 関係式は y = αx + β という形式で表されます。 それでは、実際にプログラムを通して単純線形回帰の仕組みを見ていきましょう。 #単純線形回帰 import numpy as np import matplotlib.pyplot as plt np.random.seed(1) n = 70 x = np.random.randn(n) y = x * np.random.randn(n) colo