Pthreads в C, второй поток не будет выполнен - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть этот код, который читает два целых числа из файла. И сохраняет его в буфере [] для использования во второй используемой функции. Я не уверен, что мои условия остановки в первой функции верны. Выглядит хорошо, но при запуске кода останавливается на второй функции.

static int count = 0;
int buffer[5];
int requestNum = 1;
FILE* f;

int main(int argc, char** argv)
{
    /*THREAD IDs*/
    pthread_t liftR, lift1;

    /*OPEN FILE*/
    f = fopen("sim_input.txt", "r");

    /*CREATE THREAD*/
    pthread_create(&liftR, NULL, request, NULL);
    pthread_create(&lift1, NULL, lift, NULL);

    /*RUNS TILL THREADS FINISHED*/
    pthread_join(liftR, NULL);
    pthread_join(lift1, NULL);
    /*CLEAN UP*/
    fclose(f);

    return 0;
} 
void* request(void* data1)
{
    int req1, req2, eof;

    /*NOT EOF*/
    while(eof != -1)
    {
        /*READ ONE REQUEST*/
        eof = fscanf(f, "%d %d", &req1, &req2);

        /*CHECK IF BUFFER FULLL*/
        if(count < 5)
        {
            /*ADD REQUEST TO BUFFER*/
            buffer[count] = req1;
            buffer[count + 1] = req2;

            count = count + 2;
            printf("COUNT: %d\n", count);
            /*PRINTING*/
            printf("-------------------------------------------\n");
            printf("From Buffer -> Item1: %d, Item2: %d\n", req1, req2);
            printf("Request No: %d\n", requestNum);
            printf("-------------------------------------------\n");

            requestNum++;
        }
    }

    return NULL;
}  

void* lift(void* data2)
{
    while(count > 0)
    {
        sleep(1);
        printf("================\n");
        printf("COUNT: %d\n", count);
        printf("REMOVE ITEM FROM BUFFER - DO STUFF WITH IT\n");
        printf("================\n");
        count = count - 2;
    }
    return NULL;
}  

OUTPUT: показывает количество 2, 4, 6. Показывается только 3 запроса, в файле до 10 запросов

1 Ответ

0 голосов
/ 28 апреля 2020

В вашей программе несколько ошибок:

  1. Чтение неинициализировано eof Переменная:
    int int req1, req2, eof;  // What is the value of eof? It could be -1 (or anything else).

    /*NOT EOF*/
    while(eof != -1)
Вы отбрасываете прочитанные вами данные:
        if(count < 5)
        {
            /*ADD REQUEST TO BUFFER*/
        }

Если первый поток запускается некоторое время, прежде чем запускается второй поток, он сохранит первые два запроса в buffer и выбросить остальные .

Чтобы это исправить, вам нужно дождаться, пока вторая нить истощит buffer, когда она заполнится.

Вы получаете доступ к count без какой-либо блокировки, что является гонкой данных и неопределенным поведением. Вы должны защищать чтение и запись общих (между потоками) глобалов с помощью мьютекса.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...