Advertisement
Guest User

Untitled

a guest
Mar 1st, 2015
212
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.00 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <semaphore.h>
  4. #include <pthread.h>
  5. #include <time.h>
  6.  
  7. #define NUM_OF_READERS 10
  8. #define NUM_OF_WRITERS 100
  9.  
  10.  
  11. static int glob = 0;
  12.  
  13. static long max_writers = 0;
  14. static long min_writers = 1000;
  15. static long max_readers = 0;
  16. static long min_readers = 1000;
  17. static long avg_writer = 0;
  18. static long avg_reader = 0;
  19.  
  20. static sem_t rw_mutex;
  21. static sem_t mutex;
  22. static sem_t reader_mux;
  23. static sem_t writer_mux;
  24.  
  25. static int read_count = 0;
  26.  
  27.  
  28. static void *writerFunc(void *arg){
  29. int loop = *((int*)arg);
  30. struct timeval tv;
  31. long before_time;
  32. long after_time;
  33. long difference;
  34.  
  35. if(gettimeofday(&tv,NULL)==-1){
  36. printf("Failure getting time");
  37. exit(1);
  38. }
  39.  
  40. before_time = tv.tv_usec;
  41.  
  42. do {
  43. wait(rw_mutex);
  44. glob+=10;
  45. signal(rw_mutex);
  46. }while(loop--);
  47.  
  48. if(gettimeofday(&tv,NULL)==-1){
  49. printf("Failure getting time");
  50. exit(1);
  51. }
  52.  
  53. after_time = tv.tv_usec;
  54.  
  55. wait(writer_mux);
  56.  
  57. difference = (after_time-before_time);
  58. avg_writer += difference;
  59.  
  60. if(difference>max_writers){
  61. max_writers = difference;
  62. }
  63.  
  64. if(difference<min_writers){
  65. min_writers = difference;
  66. }
  67.  
  68. signal(writer_mux);
  69.  
  70. }
  71.  
  72.  
  73. static void *readerFunc(void *arg){
  74. int loop = *((int*)arg);
  75. struct timeval tv;
  76. long before_time;
  77. long after_time;
  78. long difference;
  79.  
  80. if(gettimeofday(&tv,NULL)==-1){
  81. printf("Failure getting time");
  82. exit(1);
  83. }
  84.  
  85. before_time = tv.tv_usec;
  86.  
  87. do {
  88. wait(mutex);
  89. read_count++;
  90.  
  91. if (read_count == 1){
  92. wait(rw_mutex);
  93. }
  94.  
  95. signal(mutex);
  96. //read is performed
  97. wait(mutex);
  98. read_count--;
  99.  
  100. if (read_count == 0){
  101. signal(rw_mutex);
  102. }
  103. signal(mutex);
  104.  
  105. }while(loop--);
  106.  
  107. if(gettimeofday(&tv,NULL)==-1){
  108. printf("Failure getting time");
  109. exit(1);
  110. }
  111.  
  112. after_time = tv.tv_usec;
  113.  
  114. wait(reader_mux);
  115.  
  116. difference = (after_time-before_time);
  117. avg_reader += difference;
  118.  
  119. if(difference>max_readers){
  120. max_readers = difference;
  121. }
  122.  
  123. if(difference<min_readers){
  124. min_readers = difference;
  125. }
  126.  
  127. signal(reader_mux);
  128.  
  129. }
  130.  
  131. int main(int argc, char *argv[]) {
  132.  
  133. pthread_t readers[NUM_OF_READERS];
  134. pthread_t writers[NUM_OF_WRITERS];
  135.  
  136. int s;
  137. int loops;
  138.  
  139. if(sscanf(argv[1],"%i",&loops)==-1){
  140. printf("Couldn't read loop value");
  141. exit(1);
  142. }
  143.  
  144.  
  145. if (sem_init(&rw_mutex, 0, 1) == -1) {
  146. printf("Error, init semaphoren");
  147. exit(1);
  148. }
  149.  
  150. if(sem_init(&mutex,0,NUM_OF_READERS) == -1){
  151. printf("Error, init semaphoren");
  152. exit(1);
  153. }
  154.  
  155. if(sem_init(&reader_mux,0,1) == -1){
  156. printf("Error, init semaphoren");
  157. exit(1);
  158. }
  159.  
  160. if(sem_init(&writer_mux,0,1) == -1){
  161. printf("Error, init semaphoren");
  162. exit(1);
  163. }
  164.  
  165. int i =0;
  166.  
  167. for(i=0;i<NUM_OF_READERS;i++){
  168. s = pthread_create(readers+i, NULL, readerFunc, &loops);
  169. if (s != 0) {
  170. printf("Error, creating threadsn");
  171. exit(1);
  172. }
  173. }
  174.  
  175. for(i=0;i<NUM_OF_WRITERS;i++){
  176. s = pthread_create(writers+i, NULL, writerFunc, &loops);
  177. if (s != 0) {
  178. printf("Error, creating threadsn");
  179. exit(1);
  180. }
  181. }
  182.  
  183. for(i=0;i<NUM_OF_READERS;i++){
  184. s = pthread_join(*(readers+i), NULL);
  185. if (s != 0) {
  186. printf("Error, creating threadsn");
  187. exit(1);
  188. }
  189. }
  190.  
  191. for(i=0;i<NUM_OF_WRITERS;i++){
  192. s = pthread_join(*(writers+i), NULL);
  193. if (s != 0) {
  194. printf("Error, creating threadsn");
  195. exit(1);
  196. }
  197. }
  198.  
  199. printf("glob value %d n", glob);
  200.  
  201. printf("The maximum waiting time for writers is: %ld microseconds n",max_writers);
  202. printf("The minimum waiting time for writers is: %ld microseconds n",min_writers);
  203. printf("The average waiting time for writers is: %ld microseconds n",avg_writer/NUM_OF_WRITERS);
  204.  
  205. printf("The maximum waiting time for readers is: %ld microseconds n",max_readers);
  206. printf("The minimum waiting time for readers is: %ld microseconds n",min_readers);
  207. printf("The average waiting time for readers is: %ld microseconds n",avg_reader/NUM_OF_READERS);
  208.  
  209. exit(0);
  210. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement