Пример #1
0
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);
}
Пример #2
0
Файл: amq.c Проект: nugins99/amq
/** 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;
};