Как записать целые числа из файла в буфер, используя pthreads POSIX в Linux? - PullRequest
0 голосов
/ 30 мая 2018

Я хочу написать программу, которая будет получать целые числа из файла и помещать их в буфер, используя несколько потоков.Размер буфера составляет 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);

    }

}

1 Ответ

0 голосов
/ 30 мая 2018

У вас есть многочисленные проблемы с использованием ваших объектов синхронизации, некоторые из которых я описал в комментариях, но проблема, о которой вы спрашивали:

цикл выполняется вечно и продолжает читать толькопервое целое число в файле

возникает потому, что каждый поток заново открывает файл каждый раз, когда хочет прочитать число. Конечно, тогда он всегда читает одно и то же число (первое) и никогда не видит конца файла.

Вместо этого откройте файл всего один раз для всей программы, вероятно, в main().

...