Я хочу написать программу, которая будет получать целые числа из файла и помещать их в буфер, используя несколько потоков.Размер буфера составляет 20, и есть 100 целых чисел.Я не могу использовать цикл for, потому что один поток должен читать одно целое число за раз.Например, если мы используем один поток, этот поток должен запускаться 100 раз для чтения данных из файла в буфер.Я написал следующий код для использования POSIX pthreads.Но цикл работает вечно, и он продолжает читать только первое целое число в файле.Может кто-нибудь указать мне на ошибку, пожалуйста?(Целые числа не разделяются запятой. Пример: 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);
}
}