Advertisement
Guest User

Untitled

a guest
Dec 18th, 2017
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.78 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <pthread.h>
  3. #include <stdlib.h>
  4. #include <semaphore.h>
  5.  
  6. #define OPERATOR_NUM 1
  7. #define CUSTOMER_NUM 1
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14. static struct{
  15. sem_t line_lock;
  16. int line_number;
  17. sem_t customers[CUSTOMER_NUM];
  18. sem_t oper_line_lock;
  19. int curr_customer;
  20. sem_t customer_ready;
  21. } line_oper;
  22.  
  23.  
  24.  
  25. static struct{
  26. sem_t line_lock;
  27. int line_number;
  28. sem_t customers[CUSTOMER_NUM];
  29. sem_t customer_ready;
  30. } line_cashier;
  31.  
  32.  
  33. void * Cashier_FN(void * data){
  34. int i=0;
  35. for(; i<CUSTOMER_NUM; i++){
  36. sem_wait(&line_cashier.customer_ready);
  37. printf("cashier done queue %d\n", i);
  38. sem_post(&line_cashier.customers[i]);
  39. }
  40. }
  41.  
  42. void * Operator_FN(void * data){
  43. int oper = *(int *)data;
  44. printf("%d\n", oper);
  45. int curr_customer;
  46. while(1){
  47. sem_wait(&line_oper.customer_ready);
  48. sem_wait(&line_oper.oper_line_lock);
  49. curr_customer = line_oper.curr_customer++;
  50. sem_post(&line_oper.oper_line_lock);
  51. printf("operator %d done with queue %d\n", oper, curr_customer);
  52. sem_post(&line_oper.customers[curr_customer]);
  53. if(curr_customer == CUSTOMER_NUM)break;
  54. }
  55.  
  56. }
  57.  
  58.  
  59.  
  60. void * CUSTOMER_FN(void * data){
  61. int order;
  62.  
  63. sem_wait(&line_oper.line_lock);
  64. order = line_oper.line_number;
  65.  
  66. line_oper.line_number ++;
  67. printf("customer %d took queue number %d\n", *(int *)data,order);
  68. sem_post(&line_oper.line_lock);
  69. sem_post(&line_oper.customer_ready);
  70. sem_wait(&line_oper.customers[order]);
  71.  
  72. sem_wait(&line_cashier.line_lock);
  73. order = line_cashier.line_number++;
  74. printf("customer %d took queue for cashier%d\n",*(int *)data, order);
  75. sem_post(&line_cashier.line_lock);
  76. sem_post(&line_cashier.customer_ready);
  77. sem_wait(&line_cashier.customers[order]);
  78.  
  79.  
  80. }
  81.  
  82. void init_setup(){
  83. sem_init(&line_oper.line_lock, 0, 1);
  84. line_oper.line_number = 0;
  85. int i=0;
  86. for(; i<CUSTOMER_NUM; i++){
  87. sem_init(&line_oper.customers[i], 0, 0);
  88. }
  89. sem_init(&line_oper.oper_line_lock, 0, 1);
  90. line_oper.curr_customer = 0;
  91. sem_init(&line_oper.customer_ready, 0, 0);
  92.  
  93. sem_init(&line_cashier.line_lock, 0, 1);
  94. line_cashier.line_number = 0;
  95. i=0;
  96. for(; i<CUSTOMER_NUM; i++){
  97. sem_init(&line_cashier.customers[i], 0, 0);
  98. }
  99. line_oper.curr_customer = 0;
  100. sem_init(&line_cashier.customer_ready, 0, 0);
  101. }
  102.  
  103.  
  104. int main(){
  105. init_setup();
  106.  
  107. pthread_t cashier;
  108. pthread_create(&cashier, NULL, Cashier_FN, NULL);
  109. pthread_t t[OPERATOR_NUM];
  110. pthread_t tx[CUSTOMER_NUM];
  111. int i=0;
  112. for(; i<OPERATOR_NUM; i++){
  113. int x = i+1;
  114. pthread_create(&t[i], NULL, Operator_FN, &x);
  115. }
  116.  
  117. i=0;
  118. for(; i<CUSTOMER_NUM; i++){
  119. int x = i+1;
  120. pthread_create(&tx[i], NULL, CUSTOMER_FN, &x);
  121. }
  122.  
  123.  
  124.  
  125. for(i=0; i<CUSTOMER_NUM; i++){
  126. pthread_join(tx[i], NULL);
  127. }
  128.  
  129. for(i=0; i<OPERATOR_NUM; i++){
  130. pthread_join(t[i], NULL);
  131. }
  132. pthread_join(cashier, NULL);
  133. return 0;
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement