我创建了一个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 五 6 7 8 9 10 11 12 13 14
Out put来了: -
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个线程。不止于此。
答案 0 :(得分:2)
您需要的是一个线程池,您可以创建一个包含4个线程的池,并通过队列将工作传达给它们。主线程将读取文件并将队列中的作业(带有要处理的文本行的对象/结构)排入队列。线程将从队列中取出一个作业,处理作业,然后再获得另一份工作。
在处理一个作业后,线程不应该退出,而只是循环直到被告知停止。
答案 1 :(得分:1)
程序的结构存在根本性的错误。这就是我想你想要的:
希望这能让你走向精彩的线程世界
这实际上是另一篇文章
中提到的thread pool我在线程上找到了this wonderful tutorial,我只查看了索引表,但似乎已经覆盖了所有内容。