1

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」な方法はありますか? 私は、予想外の複雑さを引き起こさない、可能な限り単純で、最も明確で、最もクリーンなメカニズムを使用しようとしています。

フィードバックをお寄せいただきありがとうございます。

4

1 に答える 1

0

(一般的な)マルチスレッドの方法ほど「pthreads-y」の方法はありません。あなたが持っているものには何の問題もありませんが、必要以上に複雑で非効率的です.

より標準的な設計は、スレッド プールを使用することです。マスター スレッドは、キューを読み取る一連のワーカー スレッドを生成します。マスターが作業をキューに入れ、すべてのワーカーがキュー内の作業の処理に挑戦します。これにより、常にスレッドを開始および終了する必要がなくなります (ただし、より洗練されたプールには、作業負荷に基づいてプール サイズを増減するメカニズムがあります)。スレッドがデータまたはステータス情報を返す必要がある場合、マスターが読み取ることができる出力キュー (おそらく実際のデータへのポインター) を使用できます。

これにより、処理が完了したときにスレッドを取り除く方法の問題が残ります。繰り返しますが、これはマスターとワーカーの関係であるため、マスターがスレーブに自分自身をシャットダウンするように指示することをお勧めします。これは、何らかのプログラム スイッチ (現在使用しているものなど) を使用したり、どこかで条件変数を使用したり、シグナルを送信したり、スレッドをキャンセルしたりすることになります。ここには、このトピックに関する多くの質問 (および適切な回答) があります。

于 2012-04-14T00:48:54.830 に答える