#include #include #include #define C 7 #define S 5 #define CSLEEP 2 #define SSLEEP 3 pthread_t tid[C + S]; int c[C], s[S], nt[C + S]; pthread_rwlock_t rwlock; pthread_mutex_t exclusafis; //afiseaza starea curenta a cititorilor si scriitorilor void afiseaza() { int i; pthread_mutex_lock(&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); pthread_mutex_unlock(&exclusafis); } //rutina thread cititor void* cititor(void* nrc) { int indc = *(int*)nrc; for ( ; ; ) { c[indc] = -1; // Asteapta sa citeasca pthread_rwlock_rdlock(&rwlock); c[indc] = 0; // Citeste afiseaza(); sleep(1 + rand() % CSLEEP); c[indc] = -2; // A citit si doarme pthread_rwlock_unlock(&rwlock); sleep(1 + rand() % CSLEEP); } } //rutina thread scriitor void* scriitor (void* nrs) { int inds = *(int*)nrs; for ( ; ; ) { s[inds] = -1; // Asteapta sa scrie pthread_rwlock_wrlock(&rwlock); s[inds] = 0; // Scrie afiseaza(); sleep(1 + rand() % SSLEEP); s[inds] = -2; // A scris si doarme pthread_rwlock_unlock(&rwlock); sleep(1 + rand() % SSLEEP); } } //functia principala "main" main() { pthread_rwlock_init(&rwlock, NULL); pthread_mutex_init(&exclusafis, NULL); 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); pthread_rwlock_destroy(&rwlock); pthread_mutex_destroy(&exclusafis); }