簡體   English   中英

如何在C中使用pthread_join控制線程數?

[英]How to control number of threads by using pthread_join in C?

我創建了一個C程序,它將從文本文件中讀取20000個字符串,並將其發送到其他程序。 我用了一段時間來遍歷此文本文件並創建線程,該線程會將文本發送到其他程序。 但是我只希望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個線程的池,並通過隊列將工作傳達給它們。 主線程將讀取文件並使隊列(帶有待處理文本行的對象/結構)排隊。 線程將使一個作業脫離隊列,處理該作業,然后獲得另一個作業。

在僅處理一項作業之后,線程不應退出,而應循環直到被告知停止。

程序的結構根本上有問題。 這是我想你想要的:

  1. 讓main方法讀取字符串
  2. 讓main方法創建4個線程(將它們存儲在數組中)
  3. 實現某種形式的共享內存以將數據發送到4個線程
  4. 您可能需要某種形式的同步。
  5. 工作完成后,終止並加入所有4個線程

希望這能讓您踏上美好的穿線世界

實際上這是另一篇文章中提到的線程池

我發現了這個關於線程的精彩教程 ,我只瀏覽了索引表,但是似乎涵蓋了您需要的所有內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM