Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<pthread.h>
- #include<semaphore.h>
- #ifdef __unix__
- # include <unistd.h>
- #elif defined _WIN32
- # include <windows.h>
- #define sleep(x) Sleep(1000 * (x))
- #endif
- #define buffsize 8
- pthread_t mcounter[8];
- pthread_t mmonitor ,mcollector;
- int counter = 0 , buffpos = 0;
- int buffer [buffsize];
- sem_t b_empty,b_full,c_empty,c_full;
- pthread_mutex_t mutex , buffmux;
- void *counte(void *x){
- while(1){
- sleep(2);
- printf("Counter Thread : Received message \n ");
- printf("Counter Thread : Waiting to Write \n ");
- sem_wait(c_empty);
- counter++;
- printf("Counter Thread : Now adding to counter \n");
- sem_post(c_full);
- pthread_exit(NULL);
- }
- }
- void *monitor (void * x){
- while(1){
- sleep(3);
- int temp;
- printf("Monitor Thread : Waiting to Read Counter \n");
- sem_wait(c_full);
- temp = counter ;
- printf ("Monitor Thread : Reading a Count value of %d \n" , temp );
- counter = 0;
- sem_post(c_empty);
- sem_wait(b_empty);
- buffer [buffpos] = temp ;
- buffpos ++;
- sem_post(b_full);
- if(buffpos = 10 ){
- printf("Monitor : Buffer is Full ");
- }
- }
- }
- void *Collector (void *x){
- while(1){
- sleep (3);
- int val;
- sem_wait(b_full);
- printf("Collector thread : Reading from buffer at position ");
- val = buffer[buffpos] ;
- printf(" %d \n",val);
- buffpos--;
- sem_post(b_empty);
- }
- }
- void initialize (){
- sem_init(&b_full,0,0);
- sem_init(&b_empty,0,buffsize);
- sem_init(&c_full,0,0);
- sem_init(&c_empty,0,1);
- }
- void main (){
- initialize();
- int i;
- for(int i = 0 ; i < 8 ; i++){
- pthread_create(&mcounter[i],NULL,counte,NULL);
- }
- pthread_create(&mmonitor,NULL,monitor,NULL);
- pthread_create(&mcollector,NULL,Collector,NULL);
- for(int i =0 ; i<8 ;i++){
- pthread_join(mcounter[i],NULL);
- }
- pthread_join(mmonitor,NULL);
- pthread_join(mcollector,NULL);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement