void *Producer(void *arg) { int i, item, index; index = (intptr_t) arg; for (i=0; i < NITERS; i++) { /* Produce item */ item = i; /* Prepare to write item to buf */ /* If there are no empty slots, wait */ sem_acq(shared.empty); /* If another thread uses the buffer, wait */ sem_acq(shared.mutex); shared.buf[shared.in] = item; shared.in = (shared.in+1)%BUFF_SIZE; printf("[P%d] Producing %d ...\n", index, item); fflush(stdout); /* Release the buffer */ sem_rel(shared.mutex); /* Increment the number of full slots */ sem_rel(shared.full); /* Interleave producer and consumer execution */ if (i % 2 == 1) sleep(1); } return NULL; }
int consumer() { while(1) { //sleep(5); sem_acq(full); sem_acq(mutex); out = (out+1)%n; buffer[out]; printf("\nItem consumed: %d",buffer[out]); sem_rel(mutex); sem_rel(empty); sleep(rand()%5); } exit(1); }
int producer() { while(1) { sem_acq(empty); printf("\nItem produced: %d",count); sem_acq(mutex); in = (in+1)%n; buffer[in]=count++; sem_rel(mutex); sem_rel(full); sleep(rand()%2); } exit(1); }
void *Writer(void* arg) { int x = (intptr_t) arg; sem_acq(wr_sem); printf("Writer %d is writing...\n",x); printf("Writer %d finished writng...\n",x); fflush(stdout); sem_rel(wr_sem); return NULL; }
void *Consumer(void *arg){ int item, i, index; index = (intptr_t)arg; for(i=0; i < NITERS; i++){ sem_acq(shared.full); sem_acq(shared.mutex); item = shared.buf[shared.out]; shared.out = (shared.out+1)%BUFF_SIZE; printf("[P%d] Consuming %d ...\n", index, item); fflush(stdout); sem_rel(shared.mutex); sem_rel(shared.empty); if(i % 2 ==1 ) sleep(1); } return NULL; }
void *Reader(void* arg) { int x = (intptr_t) arg; sem_acq(mutex); read_count+=1; if(read_count == 1) sem_acq(wr_sem); sem_rel(mutex); printf("Reader %d is reading...\n",x); fflush(stdout); sem_acq(mutex); read_count-=1; printf("Reader %d finished reading...\n",x); fflush(stdout); if(read_count == 0) sem_rel(wr_sem); sem_rel(mutex); return NULL; }
void close_connection(t_env *env, t_play *p) { while (env->init && search_team(env)) { sem_rel(env); sem_wait(env); sem_block(env); } if (env->init) { clearmap(env); exit(0); } env->map[return_pose(env, p->init.x, p->init.y)] = 0; shmdt (env->mem); }