Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdlib.h>
- #include<stdio.h>
- #include <time.h>
- #include<pthread.h>
- void * watek_klient (void * arg);
- pthread_mutex_t muteks1;
- pthread_mutex_t muteks2;
- pthread_mutex_t muteks3;
- int wolne_kufle;
- main(){
- pthread_t *tab_klient;
- int *tab_klient_id;
- int l_kl, l_kf, l_kr, i;
- printf("\nLiczba klientow: "); scanf("%d", &l_kl);
- printf("\nLiczba kufli: "); scanf("%d", &l_kf);
- wolne_kufle = l_kf;
- //printf("\nLiczba kranow: "); scanf("%d", &l_kr);
- l_kr = 1;
- tab_klient = (pthread_t *) malloc(l_kl*sizeof(pthread_t));
- tab_klient_id = (int *) malloc(l_kl*sizeof(int));
- for(i=0;i<l_kl;i++) tab_klient_id[i]=i;
- printf("\nOtwieramy pub (simple)!\n");
- printf("\nLiczba wolnych kufli %d\n", l_kf);
- for(i=0;i<l_kl;i++){
- pthread_create(&tab_klient[i], NULL, watek_klient, &tab_klient_id[i]);
- }
- for(i=0;i<l_kl;i++){
- pthread_join( tab_klient[i], NULL);
- }
- printf("\nZamykamy pub!\n");
- }
- void * watek_klient (void * arg_wsk){
- int moj_id = * ((int *)arg_wsk);
- int i, j, kufel, result;
- int ile_musze_wypic = 2;
- printf("\nKlient %d, wchodzę do pubu\n", moj_id);
- for(i=0; i<ile_musze_wypic; i++){
- int czeka=0;
- do{
- pthread_mutex_lock(&muteks1);
- if(wolne_kufle>0){
- printf("\nKlient %d, wybieram kufel\n", moj_id);
- wolne_kufle -= 1;
- printf("\nZostało %d, wolnych kufli\n", wolne_kufle);
- pthread_mutex_unlock(&muteks1);
- break;
- }
- else{
- pthread_mutex_unlock(&muteks1);
- if (czeka!=1) printf("\nKilent %d czeka...\n", moj_id);
- czeka = 1;
- usleep(300);
- }
- }while(1);
- pthread_mutex_lock(&muteks2);
- j=0;
- printf("\nKlient %d, nalewam z kranu %d\n", moj_id, j);
- usleep(300);
- pthread_mutex_unlock(&muteks2);
- pthread_mutex_lock(&muteks3);
- printf("\nKlient %d, pije\n", moj_id);
- nanosleep((struct timespec[]){{0, 500000000L}}, NULL);
- printf("\nKlient %d, odkladam kufel\n", moj_id);
- wolne_kufle += 1;
- pthread_mutex_unlock(&muteks3);
- }
- printf("\nKlient %d, wychodzę z pubu\n", moj_id);
- return(NULL);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement