Producer-Consumer

Committer:
redona
Date:
Fri Nov 30 11:43:13 2018 +0000
Revision:
0:c9ab786082e4
Producer-Consumer

Who changed what in which revision?

UserRevisionLine numberNew contents of line
redona 0:c9ab786082e4 1 #include "mbed.h"
redona 0:c9ab786082e4 2
redona 0:c9ab786082e4 3 typedef struct {
redona 0:c9ab786082e4 4 int value;
redona 0:c9ab786082e4 5 } message_t;
redona 0:c9ab786082e4 6 Mutex mutex;
redona 0:c9ab786082e4 7 const int queue_size = 10;
redona 0:c9ab786082e4 8 ConditionVariable cond(mutex);
redona 0:c9ab786082e4 9 MemoryPool<message_t, queue_size> mpool;
redona 0:c9ab786082e4 10 Queue<message_t, queue_size> queue;
redona 0:c9ab786082e4 11 Thread thread_producer;
redona 0:c9ab786082e4 12 Thread thread_consumer;
redona 0:c9ab786082e4 13
redona 0:c9ab786082e4 14 int pointer = 0;
redona 0:c9ab786082e4 15
redona 0:c9ab786082e4 16 void producer () {
redona 0:c9ab786082e4 17 while (true) {
redona 0:c9ab786082e4 18 wait(rand()%3);
redona 0:c9ab786082e4 19 mutex.lock();
redona 0:c9ab786082e4 20 int rand_value = rand();
redona 0:c9ab786082e4 21 message_t *message = mpool.alloc();
redona 0:c9ab786082e4 22 message->value = rand_value;
redona 0:c9ab786082e4 23 queue.put(message);
redona 0:c9ab786082e4 24 pointer++;
redona 0:c9ab786082e4 25 printf("\nProducer value %d \n", message->value);
redona 0:c9ab786082e4 26 while (pointer == queue_size){
redona 0:c9ab786082e4 27 printf("\nThe queue is full, wait a consumer\n");
redona 0:c9ab786082e4 28 cond.wait();
redona 0:c9ab786082e4 29 }
redona 0:c9ab786082e4 30 cond.notify_all();
redona 0:c9ab786082e4 31 mutex.unlock();
redona 0:c9ab786082e4 32 }
redona 0:c9ab786082e4 33 }
redona 0:c9ab786082e4 34
redona 0:c9ab786082e4 35 void consumer(){
redona 0:c9ab786082e4 36 while (true) {
redona 0:c9ab786082e4 37 wait(rand()%5);
redona 0:c9ab786082e4 38 mutex.lock();
redona 0:c9ab786082e4 39 while (pointer == 0){
redona 0:c9ab786082e4 40 printf("\nThe queue is empty, wait for a producer.\n");
redona 0:c9ab786082e4 41 cond.wait();
redona 0:c9ab786082e4 42 }
redona 0:c9ab786082e4 43 osEvent evt = queue.get();
redona 0:c9ab786082e4 44 pointer--;
redona 0:c9ab786082e4 45 if (evt.status == osEventMessage) {
redona 0:c9ab786082e4 46 message_t *message = (message_t*)evt.value.p;
redona 0:c9ab786082e4 47 printf("\nGot value %.d .\n" , message->value);
redona 0:c9ab786082e4 48 mpool.free(message);
redona 0:c9ab786082e4 49 }
redona 0:c9ab786082e4 50 cond.notify_all();
redona 0:c9ab786082e4 51 mutex.unlock();
redona 0:c9ab786082e4 52 }
redona 0:c9ab786082e4 53
redona 0:c9ab786082e4 54 }
redona 0:c9ab786082e4 55
redona 0:c9ab786082e4 56 int main () {
redona 0:c9ab786082e4 57
redona 0:c9ab786082e4 58 thread_producer.start(&producer);
redona 0:c9ab786082e4 59 thread_consumer.start(&consumer);
redona 0:c9ab786082e4 60
redona 0:c9ab786082e4 61 }