Мне нужно подойти к решению проблем синхронизации в задаче чтения-записи с помощью Posix Pthreads, с которыми я неопытен.
Задание состоит из 3 читателей и 1 писателя, писатель заполняет очередь для читателей на печать. У меня проблемы с синхронизацией доступа к очереди. Очередь содержит методы, которые я протестировал и показал, как работает.
Если очередь заполнена, то она должна дать сигнал читателям прочитать / очистить очередь. Затем, когда он пуст, писатель должен начать заполнять очередь случайными значениями снова. Только на срок до 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 Created\n");
pthread_create(&writerID, NULL, writer, NULL);
printf("Writer Thread Finished\n");
pthread_join(writerID, NULL);
return 0;
}
void* writer()
{
int num1 = 0;
int num2;
int fin = FALSE;
time_t t;
srand((unsigned) time(&t));
while(!fin)
{
printf("w1");
pthread_mutex_lock(&mutex);
while(isFull(q))//While the queue is full
{
pthread_cond_wait(&qEmpty, &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(&qFull); //Signal queue is full
}
else
{
fin = TRUE;
}
pthread_mutex_unlock(&mutex);
}
}