gpt4 book ai didi

c - 如何通过在 C 中使用 pthread_join 来控制线程数?

转载 作者:太空宇宙 更新时间:2023-11-04 07:32:31 32 4
gpt4 key购买 nike

我创建了一个 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;
}

输入文本文件包含:12个3个4个5个6个78个91011121314

输出来了:-

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 个线程的池并通过队列将工作传递给它们。主线程将读取文件并将队列中的作业(包含要处理的文本行的对象/结构)排队。线程将从队列中取出一个作业,处理该作业,然后获取另一个作业。

线程不应该在处理完一个作业后退出,而是循环直到被告知停止。

关于c - 如何通过在 C 中使用 pthread_join 来控制线程数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12364644/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com