Advertisement
Guest User

Untitled

a guest
Jan 9th, 2015
260
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.75 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <pthread.h>
  3. #include <semaphore.h>
  4.  
  5. #define READERS 15
  6. #define WRITERS 10
  7.  
  8. int bufferw = 0, bufferr = 0, counterw = WRITERS, counterr = READERS;
  9. int i;
  10.  
  11. pthread_mutex_t mutex;
  12. pthread_cond_t condw, condr;
  13. pthread_t r[READERS], w[WRITERS];
  14.  
  15. void *writer(void *ptr) {
  16.  
  17. pthread_mutex_lock(&mutex);
  18.  
  19. {
  20. bufferw++;
  21. while(!(counterr == 0) && (bufferw == 0)) pthread_cond_wait(&condw, &mutex);
  22. counterw++;
  23.  
  24. pthread_mutex_unlock(&mutex);
  25.  
  26. printf("ReaderQ: %d, WriterQ: %d [in: R: %d W: %d] \n", counterr, counterw,
  27. bufferr, bufferw);
  28.  
  29. pthread_mutex_lock(&mutex);
  30.  
  31. bufferw--;
  32. counterw--;
  33. }
  34.  
  35. if(counterw > 0) pthread_cond_signal(&condw);
  36. else pthread_cond_broadcast(&condr);
  37.  
  38. pthread_mutex_unlock(&mutex);
  39.  
  40. pthread_exit(0);
  41. }
  42.  
  43. void *reader(void *ptr) {
  44.  
  45. pthread_mutex_lock(&mutex);
  46.  
  47. {
  48.  
  49. while(!(counterw == 0)) pthread_cond_wait(&condr, &mutex);
  50. ++counterr;
  51. pthread_mutex_unlock(&mutex);
  52.  
  53. printf("ReaderQ: %d, WriterQ: %d [in: R: %d W: %d] \n", counterr, counterw,
  54. bufferr, bufferw);
  55.  
  56. pthread_mutex_lock(&mutex);
  57.  
  58. }
  59.  
  60. if (--counterr == 0) pthread_cond_signal(&condw);
  61. pthread_mutex_unlock(&mutex);
  62.  
  63. pthread_exit(0);
  64. }
  65.  
  66.  
  67. int main(int argc, char* argv[]) {
  68.  
  69. pthread_mutex_init(&mutex, 0);
  70.  
  71. pthread_cond_init(&condw, 0);
  72. pthread_cond_init(&condr, 0);
  73.  
  74. for(i=0; i<WRITERS; i++) pthread_create(&w[i], NULL, writer, NULL);
  75. for(i=0; i<READERS; i++) pthread_create(&r[i], NULL, reader, NULL);
  76.  
  77. for(i=0; i<WRITERS; i++) pthread_join(w[i], NULL);
  78. for(i=0; i<READERS; i++) pthread_join(r[i], NULL);
  79.  
  80. pthread_cond_destroy(&condw);
  81. pthread_cond_destroy(&condr);
  82. pthread_mutex_destroy(&mutex);
  83.  
  84. return 0;
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement