Witam.
Potrzebuję rozwiązania problemu czytelników i pisarzy, przy użyciu semaforów oraz pamięci dzielonej, ale nie na wątkach!! Takie rozwiązanie już mam, lecz wymagane jest na procesach - chodzi o metodę z priorytetem dla pisarzy. Sam nie potrafię sobie z tym poradzić, a czas bardzo mnie goni. Może ktoś ma i mógłby się podzielić? Byłbym bardzo wdzięczny. Z góry dziękuję.
Dołączam rozwiązanie na wątkach - zasada działania musi być identyczna.
//rozwiazanie z zaglodzeniem czytenikow
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define L_PISARZY 20
#define L_CZYTELNIKOW 20
sem_t sp; //1 - jest wolne miejsce dla pisarza w czytelni
sem_t sc; //1 - sa wolne miejsca dla czytelnikow
pthread_t pisarze[L_PISARZY]; //tablica watkow pisarzy
pthread_t czytelnicy[L_CZYTELNIKOW]; //tablica watkow czytelnikow
sem_t w1, w2, w3; //pomocnicze semafory
int lc = 0; //liczba czytelnikow w bibliotece
int lp = 0; //liczba czytelnikow w bibliotece
void* pisarz (void* arg)
{
int i, num = *((int*)arg);
while(1)
{
sem_wait(&w2); //czeka na miejsce w kolejce pisarzy
lp++; //staje w kolejce
if(lp==1) sem_wait(&sc); //czeka az wyjdzie ostatni czytelnik
printf("Pisarz %d czeka...\n", num);
sem_post(&w2);
sem_wait(&sp); //czeka na mozliwosc zapisu
printf("Pisarz %d pisze...\n", num);
sleep(5);
sem_post(&sp); //konczy zapis
sem_wait(&w2);
lp--; //wychodzi z czytelni
if(lp==0) sem_post(&sc); //jezeli nie ma pisarzy w kolejce to mozna wpuszczac czytelnikow
printf("Pisarz %d wyszedl...\n", num);
sem_post(&w2);
sleep(5);
}
}
void* czytelnik (void* arg)
{
int num = *((int*)arg);
while(1)
{
printf("Czytelnik %d czeka...\n", num);
sem_wait(&w3);
sem_wait(&sc); //czeka na mozliwosc czytania
sem_wait(&w1);
lc++; //gotowy do wejscia
if(lc == 1) sem_wait(&sp); //czeka az pisarze przestana pisac
sem_post(&w1);
sem_post(&sc); //zaprasza nastepnych czytelnikow
sem_post(&w3);
printf("Czytelnik %d czyta...\n", num);
sleep(5);
sem_wait(&w1);
printf("Czytelnik %d wyszedl...\n", num);
sleep(5);
lc--; //wychodzi z czytelni
if(lc == 0) sem_post(&sp); //jezeli yszedl ostatni czytelnik to zaprasza rowniez pisarzy
sem_post(&w1);
}
}
int main ()
{
int i, *num;
sem_init(&sc, 0, 1);
sem_init(&sp, 0, 1);
sem_init(&w1, 0, 1);
sem_init(&w2, 0, 1);
sem_init(&w3, 0, 1);
for (i = 0; i < L_PISARZY; i++)
{
num = (int*)malloc(sizeof(int));
*num = i;
pthread_create(&pisarze[i], NULL, &pisarz, num); //tworzenie watkow pisarzy
}
for (i = 0; i < L_CZYTELNIKOW; i++)
{
num = (int*)malloc(sizeof(int));
*num = i;
pthread_create(&czytelnicy[i], NULL, &czytelnik, num); //tworzenie watkow czytelnikow
}
for (i = 0; i < L_PISARZY; i++) pthread_join(pisarze[i], NULL); //oczekiwanie az wszyscy pisarze wroca z czytelni
for (i = 0; i < L_CZYTELNIKOW; i++) pthread_join(czytelnicy[i], NULL); //oczekiwanie az wszyscy czytelnicy wroca z czytelni
}