Leonardo Iandiorio
/
ProducerConsumer
in class exercise
Diff: main.cpp
- Revision:
- 0:35457e400d4c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri Nov 16 14:57:57 2018 +0000 @@ -0,0 +1,58 @@ +#include "mbed.h" +typedef struct { + int value; +} message_t; +const int size = 8; +MemoryPool<message_t, size> mpool; +Queue<message_t, size> queue; +Thread thread1; +Thread thread2; +Mutex mutex; +ConditionVariable cond(mutex); +int numberOfElement = 0; + +void produce() { + while(true) { + wait(rand()%5); + int value = rand(); + mutex.lock(); + while(numberOfElement == size) { + printf("queue is full"); + cond.wait(); + } + message_t *message = mpool.alloc(); + message->value = value; + queue.put(message); + numberOfElement++; + printf("\nPut Message: %d\n\r" , message->value); + cond.notify_all(); + mutex.unlock(); + } +} + +void consume() { + while(true) { + wait(rand()%5); + mutex.lock(); + while(numberOfElement == 0) { + printf("queue is empty"); + cond.wait(); + } + osEvent evt = queue.get(); + numberOfElement--; + if (evt.status == osEventMessage) { + message_t *message = (message_t*)evt.value.p; + printf("\nConsumed Message: %d\n\r" , message->value); + mpool.free(message); + } + cond.notify_all(); + mutex.unlock(); + + } +} +int main() { + thread1.start(callback(produce)); + thread2.start(callback(consume)); + thread1.join(); + thread2.join(); +} \ No newline at end of file