Проблема синхронизации Posix Pthreads, не работающих в readers-writers

#c #multithreading #pthreads #producer-consumer

#c #многопоточность #pthreads #производитель-потребитель

Вопрос:

Я должен подойти к решению проблем синхронизации в проблеме readers-writers с Posix Pthreads, с которыми я неопытен.

Задача состоит в том, чтобы создать 3 readers и 1 writer, writer заполняет очередь для печати читателей. У меня возникли проблемы с синхронизацией доступа к очереди. Очередь содержит методы, которые я протестировал и показал, что они работают.

Если очередь заполнена, это должно сигнализировать читателям о чтении / очистке очереди. Затем, когда он пуст, писатель должен снова начать заполнять очередь случайными значениями. Только для до total_tasks .

Я в основном не уверен в правильных местах, куда должны поступать блокировки / разблокировки и сигналы.

В настоящее время при выполнении я получаю следующий вывод. Кажется, что потоки завершаются, прежде чем что-либо можно будет сделать?

Заранее спасибо.

 Reader Thread 0 Created
Reader Thread 1 Created
Reader Thread 2 Created
Writer Thread Created
Reader Thread 0 Finished
Reader Thread 1 Finished
Reader Thread 2 Finished
Writer Thread Finished
<<STUCK FOREVER>>
 
 #include <stdio.h>
#include <string.h>
#include <pthread.h>

#define TRUE 1
#define FALSE 0

int total_tasks = 0; 
int fin = FALSE; 

pthread_cond_t qEmpty = PTHREAD_COND_INITIALIZER;
pthread_cond_t qFull = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

void* writer();
void* reader();
 
 #include "rw.h"
#include "queue.h"

queue* q; 

int main()
{
    int i, j; 
    total_tasks = 15; 
    q = newQueue(5);

    pthread_t readerTID[3];
    pthread_t writerID; 

    //Create 1 Writer Thread
    printf("Writer Thread Createdn");
    pthread_create(amp;writerID, NULL, writer, NULL);

    printf("Writer Thread Finishedn");
    pthread_join(writerID, NULL);


    return 0; 
}

void* writer()
{
    int num1 = 0;
    int num2;
    int fin = FALSE; 

    time_t t;
    srand((unsigned) time(amp;t));

    while(!fin)
    {
        printf("w1");
        pthread_mutex_lock(amp;mutex);

        while(isFull(q))//While the queue is full 
        {
            pthread_cond_wait(amp;qEmpty, amp;mutex); //Wait for the readers to empty the queue
        }     

        if(num1 < total_tasks)//if we havent done all the tasks
        {
            while(!(isFull)) //If the queue isnt full - Fill with values 
            {
                printf("w2");
                num2 = (rand() % 20);
                enqueue(q, num1, num2);

                num1  ;
            }

            pthread_cond_signal(amp;qFull); //Signal queue is full 
        }
        else
        {
            fin = TRUE; 
        }

        pthread_mutex_unlock(amp;mutex);
    }
}
 

Комментарии:

1. Не должно ли это while(!(isFull)) быть while(!(isFull(q)))

2. Внешний цикл функции записи продолжается, пока значение ‘fin’ равно false. Условие if «if (num1 < total_tasks)» используется для установки ‘fin = TRUE’, когда условие принимает значение FALSE. Переменная total_tasks определена в main, но не видна в writer . Вы можете попробовать переместить объявление total_tasks в более глобальное местоположение.

3. @DavideSpataro Спасибо! Я не смог это заметить.