0

テキスト ファイルから 20000 個の文字列を読み取り、それを他のプログラムに送信する C プログラムを作成しました。このテキスト ファイルをループし、そのテキストを他のプログラムに送信するスレッドを作成するためにしばらく使用しました。しかし、4つのスレッドだけが機能するようにします。そのため、カウンターを使用してデクリメントし続け、カウンターをチェックする if 条件を使用して、カウンターが 1 に設定されると、前のスレッドに対して pthread_join を呼び出しました。最初にこれら 4 つのスレッドを終了し、次に新しい 4 つのスレッドを終了して、新しいテキスト ファイルの文字列を取得します。しかし、必要に応じて機能していません。4 スレッドごとに 4 回だけ処理します。テキスト ファイルからすべてのレコードを取得するわけではありません。

プログラム:-

int Read_record()
{
    printf("Inside Read_record()\n");
    pthread_t threads;
    int rc;
    char l_record[300];
    int thNum=4;

    while(1){
        MEMSET(g_record);

        if(fgets(g_record,300,g_r_fp)==NULL){
            printf("End of File.\n");
            break;
        }else{
            //printf("%s",g_record);
            printf("%s",g_record);
            rc = pthread_create(&threads, NULL, &Get_report, (void *)g_record);

            if (rc){
                printf("ERROR; return code from pthread_create() is %d\n", rc);
                exit(-1);
            }

            thNum--;
        }

        if(thNum==0){ 
            pthread_join(threads, NULL); 
            thNum=4;
        }
    }

    return 0;
}

入力テキスト ファイルの内容: 1 2 3 4 5 6 7 8 9 10 11 12 13 14

出力は次のとおりです。

Inside Read_record()
1
2
3
4
Inside Get_report, wget 4

Inside Get_report, wget 4

Inside Get_report, wget 4

Inside Get_report, wget 4

5
6
7
8
Inside Get_report, wget 8

Inside Get_report, wget 8

Inside Get_report, wget 8

Inside Get_report, wget 8

9
10
11
12
Inside Get_report, wget 12

Inside Get_report, wget 12

Inside Get_report, wget 12

Inside Get_report, wget 12

13
14
15
16
Inside Get_report, wget 16

Inside Get_report, wget 16

Inside Get_report, wget 16

Inside Get_report, wget 16

17
18
19
20
Inside Get_report, wget 20

Inside Get_report, wget 20

Inside Get_report, wget 20

Inside Get_report, wget 20

End of File.

欲求出力:-

Inside Get_report, wget 1
Inside Get_report, wget 2
Inside Get_report, wget 3
Inside Get_report, wget 4

Inside Get_report, wget 5
Inside Get_report, wget 6
Inside Get_report, wget 7
Inside Get_report, wget 8

Inside Get_report, wget 9
Inside Get_report, wget 10
Inside Get_report, wget 11
Inside Get_report, wget 12.
and so on..

システムで作成するスレッドは 4 つだけです。それ以上ではありません。

4

2 に答える 2

2

必要なのはスレッドプールのように聞こえます。これにより、4 つのスレッドのプールを作成し、キューを介してそれらに作業を伝達します。メインスレッドはファイルを読み取り、ジョブ (処理するテキスト行を含むオブジェクト/構造体) をキューに入れます。スレッドはジョブをキューから取り出し、そのジョブを処理してから、別のジョブを取得します。

スレッドは、ジョブを 1 つだけ処理した後に終了するのではなく、停止するように指示されるまでループする必要があります。

于 2012-09-11T07:28:23.833 に答える
1

プログラムの構造に根本的な問題があります。ここにあなたが欲しいと思うものがあります:

  1. メインメソッドに文字列を読み取らせる
  2. メイン メソッドで 4 つのスレッドを作成します (それらを配列などに格納します)。
  3. データを 4 つのスレッドに送信するために何らかの形式の共有メモリを実装する
  4. おそらく、何らかの形式の同期が必要になるでしょう。
  5. 作業が完了したら、4 つのスレッドすべてで終了して参加します

これがスレッドのすばらしい世界への道のりになることを願っています

他の投稿で述べたように、これは実際にはスレッドプールです

そして、スレッドに関するこの素晴らしいチュートリアルを見つけました。インデックステーブルを調べただけですが、必要なものはすべてカバーされているようです。

于 2012-09-11T07:31:29.370 に答える