Marco Calzana
/
ProducerConsumer
producer consumer for exercise 2
main.cpp@0:c4887d97ba83, 2018-11-28 (annotated)
- Committer:
- mcalzana
- Date:
- Wed Nov 28 16:46:47 2018 +0000
- Revision:
- 0:c4887d97ba83
exercise 2
Who changed what in which revision?
User | Revision | Line number | New 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 | } |