Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <stdio.h>
- #include <pthread.h>
- #include <unistd.h>
- #include <errno.h>
- #include <sys/types.h>
- #define CANS 2
- #define CLIENTS 6
- static int globalna= 0;
- struct pub {int cansTab[CANS]; pthread_mutex_t* mutex; pthread_mutex_t* mutex2;};
- void * funk (void * arg_wsk);
- int main(){
- pthread_mutex_t mutex, mutex2;
- if(errno=pthread_mutex_init(&mutex, NULL)){
- fprintf(stderr,"Blad inicjalizacji mutexu: %s\n",strerror(errno));
- exit(1);
- };
- if(errno=pthread_mutex_init(&mutex2, NULL)){
- fprintf(stderr,"Blad inicjalizacji mutexu: %s\n",strerror(errno));
- exit(1);
- };
- struct pub pub1;
- pub1.mutex = &mutex;
- pub1.mutex2 = &mutex2;
- int i;
- for(i=0; i<CANS; i++)
- pub1.cansTab[i] = 1;
- pthread_t tid[CLIENTS];
- for(i=0; i < CLIENTS; i++)
- {
- if(errno=pthread_create(&tid[i], NULL, funk, &pub1)){
- fprintf(stderr,"Blad tworzenia watku: %s ",strerror(errno));
- exit(1);
- };
- }
- for(i=0; i < CLIENTS; i++)
- {
- if (errno=pthread_join(tid[i],NULL))
- { fprintf(stderr,"Blad przylaczenia watku: %s ",strerror(errno));
- exit(2);
- }
- }
- if(errno=pthread_mutex_destroy(pub1.mutex)){
- fprintf(stderr,"Blad niszczenia mutexu: %s\n",strerror(errno));
- exit(1);
- };
- if(errno=pthread_mutex_destroy(pub1.mutex2)){
- fprintf(stderr,"Blad niszczenia mutexu: %s\n",strerror(errno));
- exit(1);
- };
- }
- void * funk (void * arg_wsk){
- struct pub *pub_wsk = arg_wsk;
- int nr_watku = globalna++;
- int i, canNr, useCanNr;
- for(i=0;i<2;i++)
- {
- printf("Klient %d: chcialbym wypic swoje %d piwo \n", nr_watku, i+1);
- while(1)
- {
- {
- if(pthread_mutex_trylock(&pub_wsk->mutex[canNr%CANS])==0)
- {
- useCanNr = canNr%CANS;
- break;
- }
- else { canNr++; }
- }
- pthread_mutex_lock(pub_wsk->mutex2);
- usleep(500);
- pthread_mutex_unlock(pub_wsk->mutex2);
- printf("Klient %d: Udalo mi sie :) Pije swoje %d piwo z kufla %d\n", nr_watku, i+1, useCanNr+1);
- usleep(2500);
- printf("Klient %d: Wypiłem swoje %d piwo. Odkladam %d kufel \n", nr_watku, i+1, useCanNr+1);
- pthread_mutex_unlock (&pub_wsk->mutex[useCanNr]);
- }
- return(NULL);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement