void *produce(void*args) { int i; int item; for (i = 0; i < ITEM_COUNT; i++) { sema_wait(&empty_buffer1_sema); sema_wait(&buffer1_mutex_sema); item = i + 'a'; put_item(item,&pIn,buffer1); sema_signal(&buffer1_mutex_sema); sema_signal(&full_buffer1_sema); printf("produce item: %c\n", item); } }
void *consume(void *arg) { int i; int item; for (i = 0; i < ITEM_COUNT; i++) { sema_wait(&full_buffer2_sema); sema_wait(&buffer2_mutex_sema); item = get_item(&conOut,buffer2); sema_signal(&buffer2_mutex_sema); sema_signal(&empty_buffer2_sema); printf(" consume item: %c\n", item); } }
void FLMAPI f_semSignal( F_SEM hSem) { #if defined( FLM_SOLARIS) sema_post( (sema_t *)hSem); #else sema_signal( (sema_t *)hSem); #endif }
void* ring(void*arg){ int *id; int content; id=(int*)arg; char flag=0;// is my mail? int circle=circleCount; while(circle>0){ sema_wait(&read_sema); if(readCount==0) sema_wait(&write_sema); readCount++; sema_signal(&read_sema); if(*id==((mailBox[0]-1)%N+1)){ flag=1; content=mailBox[1]; } sema_wait(&read_sema); readCount--; if(readCount==0) sema_signal(&write_sema); sema_signal(&read_sema); if(flag==1){ sema_wait(&write_sema); mailBox[0]=*id+1; mailBox[1]=content+1; sema_signal(&write_sema); int i; /* for(i=0;i<*id-1;i++) printf("\t"); printf("this is thread_%d:Receive:%d;Send:%d\n",*id,content,content+1); */ assert(*id==content%N+1); flag=0; circle--; // if(circle%10==0) // printf("%d\n",circle); } else{ usleep(sleepTime); } } }
void *calculate(void *arg) { int i; int item; for (i = 0; i < ITEM_COUNT; i++) { sema_wait(&full_buffer1_sema); sema_wait(&buffer1_mutex_sema); item = get_item(&calOut,buffer1); sema_signal(&buffer1_mutex_sema); sema_signal(&empty_buffer1_sema); item=item+'A'-'a'; sema_wait(&empty_buffer2_sema); sema_wait(&buffer2_mutex_sema); put_item(item,&calIn,buffer2); sema_signal(&buffer2_mutex_sema); sema_signal(&full_buffer2_sema); printf(" calculate item: %c\n", item); } }
void monkey(void* m) { int num = (int)m; while(dominantMonkey != 0){} sema_acquire(tree); //printf(1,"Monkey acq Count: %d\n", tree->count); printf(1,"Monkey #%d UP\n", num); int i = 0; int coconutTimer = random(99999) + 500000; for(;i < coconutTimer; i++){} printf(1,"Monkey $%d DOWN\n",num); sema_signal(tree); //printf(1,"Monkey sig Count: %d\n", tree->count); texit(); }
void dmonkey(void* m) { dominantMonkey++; sema_acquire(tree); //printf(1,"Monkey acq Count: %d\n", tree->count); printf(1,"Dominant Monkey UP\n"); int i = 0; int coconutTimer = random(99999) + 500000; for(;i < coconutTimer; i++){} printf(1,"Dominant Monkey DOWN\n"); sema_signal(tree); dominantMonkey--; //printf(1,"Monkey sig Count: %d\n", tree->count); texit(); }