pthread を使用する最初の本格的な試みとして、既に作成したアプリをスレッドを使用するように適応させようとしています。
私が念頭に置いているパラダイムは、基本的に、処理されるデータ項目のリストを反復処理する 1 つの「マスター」スレッドを持ち、それぞれに対して新しいスレッドを起動し、任意の時点で MAX_THREADS スレッドを実行することです (残りのタスクの数が完了するまで)。これより少ない)、それぞれがリスト内の単一のデータ要素に対して同じタスクを実行します。
マスター スレッドは、いずれかのスレッドがそのタスクを完了して戻った (または pthread_exit() が実行された) ときはいつでも認識し、すぐに新しいスレッドを起動してリスト内の次のタスクを実行する必要があります。
私が疑問に思っているのは、そのようなデザインを扱うために人々が好む方法は何ですか? データに関する考慮事項はさておき、これを達成するために使用する最も単純な pthreads 関数のセットは何でしょうか? 明らかに、pthread_join() は、スレッドを「チェック」するための手段として提供されています。
初期の実験では、pthread_create() の最終引数として渡される構造体を使用してきました。この構造体には、スレッドが起動時に true に設定し、戻る直前にリセットする「running」と呼ばれる要素が含まれています。マスター スレッドは、ループ内の各スレッドのこの struct 要素の現在の値をチェックするだけです。
プログラムがスレッド管理に使用するデータは次のとおりです。
typedef struct thread_args_struct
{
char *data; /* the data item the thread will be working on */
int index; /* thread's index in the array of threads */
int thread_id; /* thread's actual integer id */
int running; /* boolean status */
int retval; /* value to pass back from thread on return */
} thread_args_t;
/*
* array of threads (only used for thread creation here, not referenced
* otherwise)
*/
pthread_t thread[MAX_THREADS];
/*
* array of argument structs
*
* a pointer to the thread's argument struct will be passed to it on creation,
* and the thread will place its return value in the appropriate struct element
* before returning/exiting
*/
thread_args_t thread_args[MAX_THREADS];
これはサウンドデザインのように見えますか?スレッドの実行中/終了ステータスを監視するための、より標準化されたより良い方法、より「pthreads-y」な方法はありますか? 私は、予想外の複雑さを引き起こさない、可能な限り単純で、最も明確で、最もクリーンなメカニズムを使用しようとしています。
フィードバックをお寄せいただきありがとうございます。