producer consumer for exercise 2

Committer:
mcalzana
Date:
Wed Nov 28 16:46:47 2018 +0000
Revision:
0:c4887d97ba83
exercise 2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mcalzana 0:c4887d97ba83 1 #include "mbed.h"
mcalzana 0:c4887d97ba83 2 Mutex mutex;
mcalzana 0:c4887d97ba83 3 ConditionVariable cond(mutex);
mcalzana 0:c4887d97ba83 4 const int size = 3;
mcalzana 0:c4887d97ba83 5 int numberOfItems = 0;
mcalzana 0:c4887d97ba83 6
mcalzana 0:c4887d97ba83 7 typedef struct{
mcalzana 0:c4887d97ba83 8 int number;
mcalzana 0:c4887d97ba83 9 }message_t;
mcalzana 0:c4887d97ba83 10 MemoryPool<message_t, size> mpool;
mcalzana 0:c4887d97ba83 11 Queue<message_t, size> queue;
mcalzana 0:c4887d97ba83 12
mcalzana 0:c4887d97ba83 13 void consumer(){
mcalzana 0:c4887d97ba83 14 while(true){
mcalzana 0:c4887d97ba83 15 wait(rand() % 3);
mcalzana 0:c4887d97ba83 16 mutex.lock();
mcalzana 0:c4887d97ba83 17 if(numberOfItems > 0){
mcalzana 0:c4887d97ba83 18 osEvent evt = queue.get();
mcalzana 0:c4887d97ba83 19 message_t *message = (message_t*)evt.value.p;
mcalzana 0:c4887d97ba83 20 printf("number %d consumed", message->number);
mcalzana 0:c4887d97ba83 21 numberOfItems--;
mcalzana 0:c4887d97ba83 22 printf("Consumer. there are %d elements in queue\n", numberOfItems);
mcalzana 0:c4887d97ba83 23 mpool.free(message);
mcalzana 0:c4887d97ba83 24 }else{
mcalzana 0:c4887d97ba83 25 printf("Consumer. queue is empty\n");
mcalzana 0:c4887d97ba83 26 }
mcalzana 0:c4887d97ba83 27 cond.notify_all();
mcalzana 0:c4887d97ba83 28 mutex.unlock();
mcalzana 0:c4887d97ba83 29 }
mcalzana 0:c4887d97ba83 30 }
mcalzana 0:c4887d97ba83 31
mcalzana 0:c4887d97ba83 32
mcalzana 0:c4887d97ba83 33 int main() {
mcalzana 0:c4887d97ba83 34 Thread thread;
mcalzana 0:c4887d97ba83 35 thread.start(consumer);
mcalzana 0:c4887d97ba83 36
mcalzana 0:c4887d97ba83 37 //Producer
mcalzana 0:c4887d97ba83 38 while(true){
mcalzana 0:c4887d97ba83 39 wait(rand() % 3);
mcalzana 0:c4887d97ba83 40 mutex.lock();
mcalzana 0:c4887d97ba83 41 if(numberOfItems < size){
mcalzana 0:c4887d97ba83 42 message_t *message = mpool.alloc();
mcalzana 0:c4887d97ba83 43 message->number = rand();
mcalzana 0:c4887d97ba83 44 queue.put(message);
mcalzana 0:c4887d97ba83 45 numberOfItems++;
mcalzana 0:c4887d97ba83 46 printf("Producer. there are %d elements in queue\n", numberOfItems);
mcalzana 0:c4887d97ba83 47 }else{
mcalzana 0:c4887d97ba83 48 printf("Producer. queue full\n");
mcalzana 0:c4887d97ba83 49 }
mcalzana 0:c4887d97ba83 50 cond.notify_all();
mcalzana 0:c4887d97ba83 51 mutex.unlock();
mcalzana 0:c4887d97ba83 52 }
mcalzana 0:c4887d97ba83 53 }