int main(int argc, char **argv) { int n, e, item; unsigned seed, prod_sum, cons_sum; if (argc > 1 && !strcmp("-", argv[1])) { printf("usage: %s num_items busy_loops\n", argv[0]); exit(1); } if (argc > 1) { num_items = atoi(argv[1]); if (num_items < 0) num_items = 0; } if (argc > 2) busy_loops = atoi(argv[2]); printf("num_items %d busy-loops %d\n", num_items, busy_loops); seed = prod_sum = cons_sum = 0; for (n = 0; n < num_items; ++n) { item = ProduceItem(&seed, &prod_sum); ConsumeItem(item, &cons_sum); } printf("prot_sum %u cons_sum %u\n", prod_sum, cons_sum); if (cons_sum != prod_sum) printf("ERROR\n"); return 0; }
void * Producer(void *v) { struct thread_data *data = (struct thread_data *)v; unsigned seed = data->seed; int n; unsigned item, sum; int waits = 0; data->sum = 0; for (n = 0; n < num_items; ++n) { pthread_testcancel(); sum = 0; item = ProduceItem(&seed, &sum); pthread_cleanup_push(pthread_mutex_unlock, &buf_mutex); Pthread_mutex_lock(&buf_mutex); while (buflen == maxbuflen) { ++waits; Pthread_cond_wait(&full_cond, &buf_mutex); } buf[buflen++] = item; data->sum += sum; if (buflen == 1) Pthread_cond_broadcast(&empty_cond); pthread_cleanup_pop(1); } printf("Producer %d exit, %d waits\n", data->no, waits); return data; }
void ProducerTask() { for(int i = 1;i<=kItemsToProduce;++i) { std::cout << "Produce the"<< i << "^th item..."<< std::endl; ProduceItem(&gItemRepository,i); } }
void * Producer(void *v) { struct producer *p = (struct producer *)v; struct consumer *c; struct packet *pa, *old; unsigned seed = p->seed; int n, k, cons; unsigned sum = 0; int waits = 0; int more = 1; int item_cnt = 0; cons = seed % num_consumers; for (n = 0; more; ++n) { /* Hole Packet aus lokaler emptyPacketQueue */ Pthread_mutex_lock(&p->queue_mutex); while (!p->emptyPacketQueue) { ++waits; Pthread_cond_wait(&p->empty_cond, &p->queue_mutex); } pa = p->emptyPacketQueue; p->emptyPacketQueue = pa->next; Pthread_mutex_unlock(&p->queue_mutex); /* Fuelle Packet */ for (k = 0; k < buflen; ++k) { pa->buf[k] = ProduceItem(&seed, &sum); if (++item_cnt == num_items) { more = 0; ++k; break; } } pa->len = k; /* Versende Packet an Consumer cons */ c = consumers + cons; Pthread_mutex_lock(&c->queue_mutex); old = pa->next = c->fullPacketQueue; c->fullPacketQueue = pa; Pthread_mutex_unlock(&c->queue_mutex); if (!old) Pthread_cond_broadcast(&c->empty_cond); if (++cons == num_consumers) cons = 0; } p->sum = sum; printf("Producer %d exit, %d waits, %d packets\n", p->no, waits, n); return NULL; }