Advertisement
Guest User

Untitled

a guest
Jan 18th, 2020
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.72 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<pthread.h>
  4. #include<unistd.h>
  5.  
  6. typedef int buffer_type;
  7. int buffer_size;
  8. int number_of_readers;
  9. int number_of_items;
  10. int number_of_places=0;
  11. int MAX;
  12.  
  13. buffer_type * buffer;
  14. pthread_mutex_t * mutex;
  15. pthread_mutex_t mutex_print;
  16.  
  17. int * items_unread;
  18. int ** reader_item;
  19. int * indexes;
  20.  
  21. pthread_t * readers;
  22. pthread_t writer;
  23. buffer_type get_buffer_item()
  24. {
  25. return rand()%1000;
  26. }
  27. void display_buffer_item(buffer_type item)
  28. {
  29. printf("item is : %d\n", item);
  30. }
  31.  
  32. void initialize()
  33. {
  34. buffer = (buffer_type*) malloc( sizeof(buffer_type) * buffer_size );
  35. mutex = (pthread_mutex_t*) malloc( sizeof(pthread_mutex_t) * buffer_size );
  36. pthread_mutex_init(&mutex_print, NULL);
  37. items_unread = (int*) malloc( sizeof(int) * buffer_size );
  38. for(int i=0; i<buffer_size; i++)
  39. {
  40. items_unread[i] = 0;
  41. buffer[i] = -1;
  42. pthread_mutex_init( &mutex[i], NULL );
  43. }
  44.  
  45. readers = (pthread_t*) malloc( sizeof(pthread_t) * number_of_readers );
  46. indexes = (int*) malloc( sizeof(int) * number_of_readers );
  47.  
  48. for(int i=0; i<number_of_readers; i++)
  49. indexes[i] = i;
  50.  
  51. reader_item = (int**) malloc( sizeof(int*) * number_of_readers );
  52. for(int i=0; i<number_of_readers; i++)
  53. reader_item[i] = (int*) malloc( sizeof(int) * buffer_size );
  54.  
  55. for(int i=0; i<number_of_readers; i++)
  56. for(int j=0; j<buffer_size; j++)
  57. reader_item[i][j] = 0;
  58. }
  59.  
  60. void read_it(int reader_id, int item_id, int* unread)
  61. {
  62. int old_cancel_state;
  63. pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &old_cancel_state);
  64. printf("%d reads id = %d , item = %d\n", reader_id, item_id, buffer[item_id]);
  65. pthread_setcancelstate (old_cancel_state, NULL);
  66. reader_item[reader_id][item_id] = 1;
  67. items_unread[item_id]--;
  68. (*unread)--;
  69.  
  70. }
  71.  
  72. void* reader_thread(void* args)
  73. {
  74.  
  75. int idx = *(int*)args;
  76. int unread = number_of_items;
  77. while(unread)
  78. {
  79.  
  80. int item_idx = rand()%buffer_size;
  81. pthread_mutex_lock(&mutex[item_idx]);
  82. if(buffer[item_idx]!=-1 && !reader_item[idx][item_idx])
  83. read_it(idx, item_idx, &unread);
  84. pthread_mutex_unlock(&mutex[item_idx]);
  85. }
  86.  
  87. if(unread==0){printf("reader exits %d\n", idx);
  88. number_of_places--;}
  89. return NULL;
  90. }
  91.  
  92. void insert_into_buffer(int idx, int * items_remainig)
  93. {
  94. printf("writer enters - %d \t",idx);
  95. int old_cancel_state;
  96. buffer_type item = get_buffer_item();
  97. buffer[idx] = item;
  98. items_unread[idx] = number_of_readers;
  99. for(int i=0; i<number_of_readers; i++)
  100. reader_item[i][idx] = 0;
  101. (*items_remainig)--;
  102. pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &old_cancel_state);
  103. printf("writer writes id = %d : item = %d\t", idx, item);
  104. pthread_setcancelstate (old_cancel_state, NULL);
  105. printf("writer exits - %d \n" ,idx);
  106. }
  107.  
  108. void* writer_thread(void* no)
  109. {
  110. int j, items_remainig = number_of_items;
  111. while(items_remainig)
  112. {
  113. for(int i=0; i<buffer_size; i++)
  114. {
  115. j = 0;
  116. pthread_mutex_lock(&mutex[i]);
  117. if(items_unread[i]==0)
  118. {
  119. insert_into_buffer(i, &items_remainig);
  120. j = 1;
  121. }
  122. pthread_mutex_unlock(&mutex[i]);
  123. if(j)break;
  124. }
  125. }
  126.  
  127. return NULL;
  128. }
  129.  
  130. void start_threads() {
  131. int flag=0;
  132. pthread_create( &writer, NULL, writer_thread, NULL);
  133. for(int i=0; i<number_of_readers; i++){
  134. if(MAX>number_of_places){
  135. pthread_create(&readers[i], NULL, reader_thread, &indexes[flag]);
  136. number_of_places++;
  137.  
  138. flag++;
  139. }
  140. else {i--;}}
  141.  
  142. for(int i=0; i<number_of_readers; i++)
  143. pthread_join(readers[i], 0);
  144. pthread_join(writer, 0);
  145. }
  146.  
  147. void cleanout()
  148. {
  149. free(buffer);
  150. free(mutex);
  151. free(indexes);
  152. free(readers);
  153. free(items_unread);
  154. for(int i=0; i<number_of_readers; i++)
  155. free(reader_item[i]);
  156. free(reader_item);
  157. }
  158.  
  159. int getNum(char * str)
  160. {
  161. if(str==NULL)return -1;
  162. int a=0, i=0;
  163. while(1)
  164. {
  165. if(str[i]=='\0')break;
  166. if(str[i]<'0' || str[i]>'9')
  167. {
  168. a=-1;
  169. break;
  170. }
  171. a = a*10 + str[i]-'0';
  172. i++;
  173. }
  174. return a;
  175. }
  176.  
  177. int main(int argc, char *argv[])
  178. {
  179. if(argc != 4)
  180. {
  181. printf("give correct args.\n");
  182. printf("./[programname] num_readers number_of_items\n");
  183. return 0;
  184. }
  185. int numReaders = getNum(argv[1]);
  186. int buffSize = getNum(argv[1]);
  187. int numItems = getNum(argv[2]);
  188. int places = getNum(argv[3]);
  189. MAX=places;
  190. if(numReaders<0 || numItems<0 || places<0)
  191. {
  192. printf("give correct args.\n");
  193. printf("./[programname] num_readers number_of_writers number_of_places\n");
  194. return 0;
  195. }
  196.  
  197. number_of_items = numItems;
  198. buffer_size = buffSize;
  199. number_of_readers = numReaders;
  200. initialize();
  201. start_threads();
  202. cleanout();
  203. return 0;
  204. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement