【发布时间】:2012-09-11 07:19:14
【问题描述】:
我创建了一个 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 个线程。仅此而已。
【问题讨论】:
-
你创建了四个线程,但是线程id只保存到一个变量中(每次创建线程都会覆盖),所以你只会加入最后一个线程。
-
谢谢约阿希姆。你想让我创建 4 个不同的线程变量,然后为每个线程添加一个连接吗?像线程1。线程2。线程 3,线程 4。然后是 pthread_join(thread1,NULL), pthread_join(thread2,NULL), pthread_join(thread3,NULL), pthread_join(thread4,NULL) ?但它会是多线程吗?
-
一个数组可能会更好,因为你可以使用例如
thNum在创建时对其进行索引。
标签: c multithreading pthreads pthread-join