如何使用 Linux 中的 POSIX pthreads 将整数从文件写入缓冲区?
How to write integers from file to buffer using POSIX pthreads in Linux?
我想编写一个程序来使用多线程从文件中获取整数并将它们放入缓冲区中。缓冲区大小为 20,有 100 个整数。我不能使用 for 循环,因为一个线程应该一次读取一个整数。例如,如果我们使用一个线程,该线程必须 运行 100 次才能将数据从文件读取到缓冲区。我使用 POSIX pthreads 编写了以下代码。但是循环 运行 永远持续下去,它只读取文件中的第一个整数。有人可以指出我的错误吗? (整数不由 comma.Ex 分隔:1 2 3 4 ....等 100 )
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
pthread_mutex_t m;
pthread_cond_t r;
pthread_cond_t w;
FILE *fp;
int cnt_w = 0;
int cnt_r= 0;
int value;
int buf[20];
int cnt = 0;
int z = 0;
int flag =0;
void *read(void *parm);
void *write(void *parm);
int main(int argc, char argv[])
{
pthread_t rid[2];
pthread_t wid[2];
for( int i = 0; i< 2; i++)
{
printf("Writer %d Starts \n",i+1);
pthread_create(&wid[i], NULL, write, i);
}
// for(int i = 0; i < 2; i++)
// {
// printf("Reader %d Starts \n",i+1);
// pthread_create(&rid[i],NULL,read,i);
// }
// for(int i = 0; i < 2; i++)
// {
// pthread_join(rid[i],NULL);
// }
for(int i = 0; i < 2; i++)
{
pthread_join(wid[i], NULL);
}
for(int i =0;i<3;i++)
{
printf("%d ",buf[i]);
}
return 0;
}
void *read(void *parm)
{
}
void *write(void *parm)
{
int x = (int)parm ;
int y = 0;
while(flag != -1) {
pthread_mutex_lock(&m);
printf("Writer %d Locked Mutex\n", x + 1);
while (cnt != 0) {
printf("Writer %d is waiting\n", x + 1);
}
cnt++;
printf("Writer %d Access CS \n", x + 1);
if ((fp = fopen("/home/pegasus/2/shared_data.txt", "r")) == NULL) {
fprintf(stderr, "Couldn't find the file");
} else {
fscanf(fp, "%d", &value);
buf[z] = value;
printf("Buf value = %d\n", buf[z]);
y++;
printf("z = %d\n", z);
z = z + y;
printf("z = %d\n", z);
sleep(1);
if (feof(fp)) {
flag = -1;
break;
}
fclose(fp);
}
printf("Writer %d Finished Access CS \n", x + 1);
printf("x = %d \n", y);
cnt = 0;
pthread_cond_signal(&r);
printf("Signal Reader\n");
pthread_cond_signal(&w);
printf("Signal Writer\n");
printf("Writer %d Unlocked Mutex\n", x + 1);
pthread_mutex_unlock(&m);
}
}
您在使用同步对象的方式上遇到了很多问题,我在评论中描述了其中一些问题,但您提出的问题是:
the loop runs forever and it keeps reading only the first integer on the file
发生是因为每个线程每次要读取一个数字时都会重新打开文件。 当然然后它总是读取相同的数字(第一个),并且永远不会看到文件的末尾。
相反,整个程序只打开一次文件,可能在 main()
。
我想编写一个程序来使用多线程从文件中获取整数并将它们放入缓冲区中。缓冲区大小为 20,有 100 个整数。我不能使用 for 循环,因为一个线程应该一次读取一个整数。例如,如果我们使用一个线程,该线程必须 运行 100 次才能将数据从文件读取到缓冲区。我使用 POSIX pthreads 编写了以下代码。但是循环 运行 永远持续下去,它只读取文件中的第一个整数。有人可以指出我的错误吗? (整数不由 comma.Ex 分隔:1 2 3 4 ....等 100 )
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
pthread_mutex_t m;
pthread_cond_t r;
pthread_cond_t w;
FILE *fp;
int cnt_w = 0;
int cnt_r= 0;
int value;
int buf[20];
int cnt = 0;
int z = 0;
int flag =0;
void *read(void *parm);
void *write(void *parm);
int main(int argc, char argv[])
{
pthread_t rid[2];
pthread_t wid[2];
for( int i = 0; i< 2; i++)
{
printf("Writer %d Starts \n",i+1);
pthread_create(&wid[i], NULL, write, i);
}
// for(int i = 0; i < 2; i++)
// {
// printf("Reader %d Starts \n",i+1);
// pthread_create(&rid[i],NULL,read,i);
// }
// for(int i = 0; i < 2; i++)
// {
// pthread_join(rid[i],NULL);
// }
for(int i = 0; i < 2; i++)
{
pthread_join(wid[i], NULL);
}
for(int i =0;i<3;i++)
{
printf("%d ",buf[i]);
}
return 0;
}
void *read(void *parm)
{
}
void *write(void *parm)
{
int x = (int)parm ;
int y = 0;
while(flag != -1) {
pthread_mutex_lock(&m);
printf("Writer %d Locked Mutex\n", x + 1);
while (cnt != 0) {
printf("Writer %d is waiting\n", x + 1);
}
cnt++;
printf("Writer %d Access CS \n", x + 1);
if ((fp = fopen("/home/pegasus/2/shared_data.txt", "r")) == NULL) {
fprintf(stderr, "Couldn't find the file");
} else {
fscanf(fp, "%d", &value);
buf[z] = value;
printf("Buf value = %d\n", buf[z]);
y++;
printf("z = %d\n", z);
z = z + y;
printf("z = %d\n", z);
sleep(1);
if (feof(fp)) {
flag = -1;
break;
}
fclose(fp);
}
printf("Writer %d Finished Access CS \n", x + 1);
printf("x = %d \n", y);
cnt = 0;
pthread_cond_signal(&r);
printf("Signal Reader\n");
pthread_cond_signal(&w);
printf("Signal Writer\n");
printf("Writer %d Unlocked Mutex\n", x + 1);
pthread_mutex_unlock(&m);
}
}
您在使用同步对象的方式上遇到了很多问题,我在评论中描述了其中一些问题,但您提出的问题是:
the loop runs forever and it keeps reading only the first integer on the file
发生是因为每个线程每次要读取一个数字时都会重新打开文件。 当然然后它总是读取相同的数字(第一个),并且永远不会看到文件的末尾。
相反,整个程序只打开一次文件,可能在 main()
。