Leonardo Iandiorio
/
ProducerConsumer
in class exercise
main.cpp@0:35457e400d4c, 2018-11-16 (annotated)
- Committer:
- iandil
- Date:
- Fri Nov 16 14:57:57 2018 +0000
- Revision:
- 0:35457e400d4c
producer consumer threadsafed
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
iandil | 0:35457e400d4c | 1 | #include "mbed.h" |
iandil | 0:35457e400d4c | 2 | typedef struct { |
iandil | 0:35457e400d4c | 3 | int value; |
iandil | 0:35457e400d4c | 4 | } message_t; |
iandil | 0:35457e400d4c | 5 | const int size = 8; |
iandil | 0:35457e400d4c | 6 | MemoryPool<message_t, size> mpool; |
iandil | 0:35457e400d4c | 7 | Queue<message_t, size> queue; |
iandil | 0:35457e400d4c | 8 | Thread thread1; |
iandil | 0:35457e400d4c | 9 | Thread thread2; |
iandil | 0:35457e400d4c | 10 | Mutex mutex; |
iandil | 0:35457e400d4c | 11 | ConditionVariable cond(mutex); |
iandil | 0:35457e400d4c | 12 | int numberOfElement = 0; |
iandil | 0:35457e400d4c | 13 | |
iandil | 0:35457e400d4c | 14 | void produce() { |
iandil | 0:35457e400d4c | 15 | while(true) { |
iandil | 0:35457e400d4c | 16 | wait(rand()%5); |
iandil | 0:35457e400d4c | 17 | int value = rand(); |
iandil | 0:35457e400d4c | 18 | mutex.lock(); |
iandil | 0:35457e400d4c | 19 | while(numberOfElement == size) { |
iandil | 0:35457e400d4c | 20 | printf("queue is full"); |
iandil | 0:35457e400d4c | 21 | cond.wait(); |
iandil | 0:35457e400d4c | 22 | } |
iandil | 0:35457e400d4c | 23 | message_t *message = mpool.alloc(); |
iandil | 0:35457e400d4c | 24 | message->value = value; |
iandil | 0:35457e400d4c | 25 | queue.put(message); |
iandil | 0:35457e400d4c | 26 | numberOfElement++; |
iandil | 0:35457e400d4c | 27 | printf("\nPut Message: %d\n\r" , message->value); |
iandil | 0:35457e400d4c | 28 | cond.notify_all(); |
iandil | 0:35457e400d4c | 29 | mutex.unlock(); |
iandil | 0:35457e400d4c | 30 | } |
iandil | 0:35457e400d4c | 31 | } |
iandil | 0:35457e400d4c | 32 | |
iandil | 0:35457e400d4c | 33 | void consume() { |
iandil | 0:35457e400d4c | 34 | while(true) { |
iandil | 0:35457e400d4c | 35 | wait(rand()%5); |
iandil | 0:35457e400d4c | 36 | mutex.lock(); |
iandil | 0:35457e400d4c | 37 | while(numberOfElement == 0) { |
iandil | 0:35457e400d4c | 38 | printf("queue is empty"); |
iandil | 0:35457e400d4c | 39 | cond.wait(); |
iandil | 0:35457e400d4c | 40 | } |
iandil | 0:35457e400d4c | 41 | osEvent evt = queue.get(); |
iandil | 0:35457e400d4c | 42 | numberOfElement--; |
iandil | 0:35457e400d4c | 43 | if (evt.status == osEventMessage) { |
iandil | 0:35457e400d4c | 44 | message_t *message = (message_t*)evt.value.p; |
iandil | 0:35457e400d4c | 45 | printf("\nConsumed Message: %d\n\r" , message->value); |
iandil | 0:35457e400d4c | 46 | mpool.free(message); |
iandil | 0:35457e400d4c | 47 | } |
iandil | 0:35457e400d4c | 48 | cond.notify_all(); |
iandil | 0:35457e400d4c | 49 | mutex.unlock(); |
iandil | 0:35457e400d4c | 50 | |
iandil | 0:35457e400d4c | 51 | } |
iandil | 0:35457e400d4c | 52 | } |
iandil | 0:35457e400d4c | 53 | int main() { |
iandil | 0:35457e400d4c | 54 | thread1.start(callback(produce)); |
iandil | 0:35457e400d4c | 55 | thread2.start(callback(consume)); |
iandil | 0:35457e400d4c | 56 | thread1.join(); |
iandil | 0:35457e400d4c | 57 | thread2.join(); |
iandil | 0:35457e400d4c | 58 | } |