Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <pthread.h>
- #include <unistd.h>
- int czytelnicyK = 0, pisarzeK = 0, pisarzeB=0, czytelnicyB=0;
- int i;
- pthread_mutex_t biblioteka;
- pthread_cond_t czytelnicy, pisarze;
- void *czytelnik( ) {
- while(1)
- {
- pthread_mutex_lock(&biblioteka);
- czytelnicyK++;
- printf("ReaderQ: %d WriterQ: %d [In R: %d W: %d]\n",czytelnicyK,pisarzeK,czytelnicyB,pisarzeB);
- while (!(pisarzeK == 0))
- pthread_cond_wait(&czytelnicy, &biblioteka);
- pthread_mutex_unlock(&biblioteka);
- czytelnicyB++;
- printf("Czytelnik %d wchodzi...\n",czytelnicyB);
- czytelnicyK--;
- printf("ReaderQ: %d WriterQ: %d [In R: %d W: %d]\n",czytelnicyK,pisarzeK,czytelnicyB,pisarzeB);
- sleep(1);
- pthread_mutex_lock(&biblioteka);
- czytelnicyB--;
- printf(" Czytelnik %d wychodzi...\n",czytelnicyB + 1);
- printf("ReaderQ: %d WriterQ: %d [In R: %d W: %d]\n",czytelnicyK,pisarzeK,czytelnicyB,pisarzeB);
- if (czytelnicyB == 0)
- pthread_cond_signal(&pisarze);
- pthread_mutex_unlock(&biblioteka);
- }
- }
- void *pisarz() {
- while(1)
- {
- pthread_mutex_lock(&biblioteka);
- pisarzeK++;
- printf("ReaderQ: %d WriterQ: %d [In R: %d W: %d]\n",czytelnicyK,pisarzeK,czytelnicyB,pisarzeB);
- while (!((czytelnicyB == 0) && (pisarzeB == 0)))
- pthread_cond_wait(&pisarze, &biblioteka);
- pthread_mutex_unlock(&biblioteka);
- pisarzeK--;
- pisarzeB++;
- printf(" Pisarz %d wchodzi...\n",pisarzeK+1);
- printf("ReaderQ: %d WriterQ: %d [In R: %d W: %d]\n",czytelnicyK,pisarzeK,czytelnicyB,pisarzeB);
- sleep(1);
- pthread_mutex_lock(&biblioteka);
- pisarzeB--;
- printf(" Pisarz %d wychodzi...\n",pisarzK+1);
- printf("ReaderQ: %d WriterQ: %d [In R: %d W: %d]\n",czytelnicyK,pisarzeK,czytelnicyB,pisarzeB);
- if(pisarzeK>0)
- pthread_cond_signal(&pisarze);
- else
- pthread_cond_broadcast(&czytelnicy);
- pthread_mutex_unlock(&biblioteka);
- }
- }
- int main(int argc, char* argv[]) {
- int ilosc_czyt=atoi(argv[1]), ilosc_pis=atoi(argv[2]);
- pthread_t c[ilosc_czyt], p[ilosc_pis];
- pthread_mutex_init(&biblioteka, 0);
- pthread_cond_init(&czytelnicy, 0);
- pthread_cond_init(&pisarze, 0);
- for(i=0; i<ilosc_czyt; i++)
- pthread_create(&c[i], NULL, czytelnik, NULL);
- for(i=0; i<ilosc_pis; i++)
- pthread_create(&p[i], NULL, pisarz, NULL);
- for(i=0; i<ilosc_pis; i++)
- pthread_join(p[i], NULL);
- for(i=0; i<ilosc_czyt; i++)
- pthread_join(c[i], NULL);
- pthread_cond_destroy(&czytelnicy);
- pthread_cond_destroy(&pisarze);
- pthread_mutex_destroy(&biblioteka);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement