如何在C中使用pthread_join来控制线程数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在C中使用pthread_join来控制线程数?相关的知识,希望对你有一定的参考价值。

我创建了一个C程序,它将从文本文件中读取20000个字符串,并将其发送到其他程序。我用了一段时间来遍历这个文本文件,并创建了将该文本发送到另一个程序的线程。但我只想要4个线程。所以我使用了一个计数器并继续递减它,并且if条件检查计数器以及何时将它设置为1然后我为前面的线程调用了pthread_join。我想首先完成这4个线程然后新的4个线程来获取新的文本文件字符串。但它不能按我的需要工作。它只处理每4个线程4次。并没有从文本文件中获取所有记录。

程序:-

int Read_record()
{
    printf("Inside Read_record()
");
    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.
");
            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
", 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. 让主方法读取字符串
  2. 让main方法创建4个线程(将它们存储在数组或其他东西中)
  3. 实现某种形式的共享内存以将数据发送到4个线程
  4. 您可能需要某种形式的同步。
  5. 工作完成后终止并加入所有4个线程

希望这能让你走向精彩的线程世界

这实际上是另一篇文章中提到的thread pool

我在线程上找到了this wonderful tutorial,我只查看了索引表,但似乎有你需要的所有内容。

以上是关于如何在C中使用pthread_join来控制线程数?的主要内容,如果未能解决你的问题,请参考以下文章

如何停止在共享库中实现的阻塞 pthread_join()

等待 pthread_create 完成而不使用 pthread_join

C语言 pthread_join()函数

是否可以在没有 pthread_join() 的情况下使用 pthread?

主线程和子线程的同步控制

SylixOS pthread_join退出