Advertisement
Guest User

Untitled

a guest
Apr 1st, 2020
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.21 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <pthread.h>
  4. #include <unistd.h>
  5. #include <errno.h>
  6. #include <sys/types.h>
  7.  
  8. #define CANS 2
  9. #define CLIENTS 6
  10.  
  11. static int globalna= 0;
  12.  
  13. struct pub {int cansTab[CANS]; pthread_mutex_t* mutex; pthread_mutex_t* mutex2;};
  14.  
  15. void * funk (void * arg_wsk);
  16.  
  17. int main(){
  18. pthread_mutex_t mutex, mutex2;
  19. if(errno=pthread_mutex_init(&mutex, NULL)){
  20. fprintf(stderr,"Blad inicjalizacji mutexu: %s\n",strerror(errno));
  21. exit(1);
  22. };
  23. if(errno=pthread_mutex_init(&mutex2, NULL)){
  24. fprintf(stderr,"Blad inicjalizacji mutexu: %s\n",strerror(errno));
  25. exit(1);
  26. };
  27.  
  28. struct pub pub1;
  29. pub1.mutex = &mutex;
  30. pub1.mutex2 = &mutex2;
  31. int i;
  32. for(i=0; i<CANS; i++)
  33. pub1.cansTab[i] = 1;
  34.  
  35. pthread_t tid[CLIENTS];
  36.  
  37. for(i=0; i < CLIENTS; i++)
  38. {
  39. if(errno=pthread_create(&tid[i], NULL, funk, &pub1)){
  40. fprintf(stderr,"Blad tworzenia watku: %s ",strerror(errno));
  41. exit(1);
  42. };
  43. }
  44.  
  45. for(i=0; i < CLIENTS; i++)
  46. {
  47. if (errno=pthread_join(tid[i],NULL))
  48. { fprintf(stderr,"Blad przylaczenia watku: %s ",strerror(errno));
  49. exit(2);
  50. }
  51. }
  52.  
  53. if(errno=pthread_mutex_destroy(pub1.mutex)){
  54. fprintf(stderr,"Blad niszczenia mutexu: %s\n",strerror(errno));
  55. exit(1);
  56. };
  57. if(errno=pthread_mutex_destroy(pub1.mutex2)){
  58. fprintf(stderr,"Blad niszczenia mutexu: %s\n",strerror(errno));
  59. exit(1);
  60. };
  61.  
  62. }
  63.  
  64. void * funk (void * arg_wsk){
  65. struct pub *pub_wsk = arg_wsk;
  66.  
  67. int nr_watku = globalna++;
  68.  
  69. int i, canNr, useCanNr;
  70. for(i=0;i<2;i++)
  71. {
  72. printf("Klient %d: chcialbym wypic swoje %d piwo \n", nr_watku, i+1);
  73.  
  74. while(1)
  75. {
  76. {
  77. if(pthread_mutex_trylock(&pub_wsk->mutex[canNr%CANS])==0)
  78. {
  79. useCanNr = canNr%CANS;
  80. break;
  81. }
  82. else { canNr++; }
  83. }
  84. pthread_mutex_lock(pub_wsk->mutex2);
  85. usleep(500);
  86. pthread_mutex_unlock(pub_wsk->mutex2);
  87. printf("Klient %d: Udalo mi sie :) Pije swoje %d piwo z kufla %d\n", nr_watku, i+1, useCanNr+1);
  88. usleep(2500);
  89. printf("Klient %d: Wypiłem swoje %d piwo. Odkladam %d kufel \n", nr_watku, i+1, useCanNr+1);
  90. pthread_mutex_unlock (&pub_wsk->mutex[useCanNr]);
  91. }
  92. return(NULL);
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement