#include #include #include #include #define C 2 #define S 5 #define CSLEEP 3 #define SSLEEP 1 pthread_t tid[C + S]; int c[C], s[S], nt[C + S]; sem_t semcititor, exclusscriitor, exclusafis; int cititori; //afiseaza starea curenta a cititorilor si scriitorilor void afiseaza() { int i; sem_wait(&exclusafis); for (i = 0; i < C; i++) printf("C%d_%d\t",i, c[i]); for (i = 0; i < S; i++) printf("S%d_%d\t",i, s[i]); printf("\n"); fflush(stdout); sem_post(&exclusafis); } //rutina thread cititor void* cititor(void* nrc) { int indc = *(int*)nrc; for ( ; ; ) { c[indc] = -1; // Asteapta sa citeasca sem_wait(&semcititor); cititori++; if (cititori == 1) sem_wait(&exclusscriitor); sem_post(&semcititor); c[indc] = 0; // Citeste afiseaza(); sleep(1 + rand() % CSLEEP); c[indc] = -2; // A citit si doarme sem_wait(&semcititor); cititori--; if (cititori == 0) sem_post(&exclusscriitor); sem_post(&semcititor); sleep(1 + rand() % CSLEEP); } } //rutina thread scriitor void* scriitor (void* nrs) { int inds = *(int*)nrs; for ( ; ; ) { s[inds] = -1; // Asteapta sa scrie sem_wait(&exclusscriitor); s[inds] = 0; // Scrie afiseaza(); sleep(1 + rand() % SSLEEP); s[inds] = -2; // A scris si doarme sem_post(&exclusscriitor); sleep(1 + rand() % SSLEEP); } } //functia principala "main" main() { sem_init(&semcititor, 0, 1); sem_init(&exclusscriitor, 0, 1); sem_init(&exclusafis, 0, 1); int i; for (i = 0; i < C; c[i] = -3, nt[i] = i, i++); // -3 : Nu a pornit for (i = 0; i < S; s[i] = -3, nt[i + C] = i, i++); for (i = 0; i < C; i++) pthread_create(&tid[i], NULL, cititor, &nt[i]); for (i = C; i < C + S; i++) pthread_create(&tid[i], NULL, scriitor, &nt[i]); for (i = 0; i < C + S; i++) pthread_join(tid[i], NULL); sem_destroy(&semcititor); sem_destroy(&exclusscriitor); sem_destroy(&exclusafis); }