Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <pthread.h>
- #include <semaphore.h>
- #define READERS 15
- #define WRITERS 10
- int bufferw = 0, bufferr = 0, counterw = WRITERS, counterr = READERS;
- int i;
- pthread_mutex_t mutex;
- pthread_cond_t condw, condr;
- pthread_t r[READERS], w[WRITERS];
- void *writer(void *ptr) {
- pthread_mutex_lock(&mutex);
- {
- bufferw++;
- while(!(counterr == 0) && (bufferw == 0)) pthread_cond_wait(&condw, &mutex);
- counterw++;
- pthread_mutex_unlock(&mutex);
- printf("ReaderQ: %d, WriterQ: %d [in: R: %d W: %d] \n", counterr, counterw,
- bufferr, bufferw);
- pthread_mutex_lock(&mutex);
- bufferw--;
- counterw--;
- }
- if(counterw > 0) pthread_cond_signal(&condw);
- else pthread_cond_broadcast(&condr);
- pthread_mutex_unlock(&mutex);
- pthread_exit(0);
- }
- void *reader(void *ptr) {
- pthread_mutex_lock(&mutex);
- {
- while(!(counterw == 0)) pthread_cond_wait(&condr, &mutex);
- ++counterr;
- pthread_mutex_unlock(&mutex);
- printf("ReaderQ: %d, WriterQ: %d [in: R: %d W: %d] \n", counterr, counterw,
- bufferr, bufferw);
- pthread_mutex_lock(&mutex);
- }
- if (--counterr == 0) pthread_cond_signal(&condw);
- pthread_mutex_unlock(&mutex);
- pthread_exit(0);
- }
- int main(int argc, char* argv[]) {
- pthread_mutex_init(&mutex, 0);
- pthread_cond_init(&condw, 0);
- pthread_cond_init(&condr, 0);
- for(i=0; i<WRITERS; i++) pthread_create(&w[i], NULL, writer, NULL);
- for(i=0; i<READERS; i++) pthread_create(&r[i], NULL, reader, NULL);
- for(i=0; i<WRITERS; i++) pthread_join(w[i], NULL);
- for(i=0; i<READERS; i++) pthread_join(r[i], NULL);
- pthread_cond_destroy(&condw);
- pthread_cond_destroy(&condr);
- pthread_mutex_destroy(&mutex);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement