void *consumer(void *consumerId){ int *consId; int r; consId = (int *)consumerId; // printf("Hello from *consumer(thread) %d \n",*consId); while(totalNumbers > 0 && endsignal == 0){ /*Locking mutex*/ rc = pthread_mutex_lock(&mutex); if (rc != 0){ printf("ERROR: retrn code from pthread_mutex_lock*() is %d \n",rc); pthread_exit(&rc); } //αν ο buffer είναι άδειος, περιμένει να εισαχθεί αριθμός while(cb_isEmpty(cb) == 1){ if(endsignal == 1){ //αν έχει σταλεί το σήμα πως τελείωσαν οι αριθμοί, σπάει break; }else{ rc = pthread_cond_wait(&bufferEmpty, &mutex); //περιμένει μέχρι να λάβει το σήμα, είτε επειδή έχει μπει αριθμός στον //buffer είτε επειδή τελείωσαν οι αριθμοί προς εξαγωγή if (rc != 0) { printf("ERROR: return code from pthread_cond_wait() is %d\n", rc); pthread_exit(&rc); } } //} } int *tmp_read = (int*)malloc(4); cb_pop_front(cb, &r); totalNumbers--; //μειώνει τους αριθμούς που απομένουν για εξαγωγή if(totalNumbers <= 0 && endsignal == 0){ //αν οι αριθμοί τελείωσαν στέλνει σήμα στα thread endsignal = 1; pthread_cond_broadcast(&bufferEmpty); } free(tmp_read); /*Unlocking mutex*/ rc = pthread_mutex_unlock(&mutex); if (rc != 0){ printf("ERROR: retrn code from pthread_mutex_lock*() is %d \n",rc); pthread_exit(&rc); } fprintf(fc2,"Consumer %d : %d \n",*consId, r); } pthread_exit(consId); }
/** receive a message */ ssize_t amq_receive(amqd_t mqdes, char*msg_ptr, size_t msg_len, unsigned msg_prio) { struct impl_t * q = (struct impl_t *)mqdes; pthread_mutex_lock(&q->mutex); // wait for next message while (q->cb.count == 0) { pthread_cond_wait(&q->cond, &q->mutex); } cb_pop_front(&q->cb, q->tmp); assert(q->tmp->size <= msg_len); memcpy(msg_ptr, q->tmp->data, q->tmp->size); // notify any pending senders that there is room if (q->cb.capacity-1 == q->cb.count) pthread_cond_broadcast(&q->cond); pthread_mutex_unlock(&q->mutex); return q->tmp->size; };