Advertisement
Guest User

Untitled

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