Redona Kembora
/
Producer-Consumer
Producer-Consumer
main.cpp@0:c9ab786082e4, 2018-11-30 (annotated)
- Committer:
- redona
- Date:
- Fri Nov 30 11:43:13 2018 +0000
- Revision:
- 0:c9ab786082e4
Producer-Consumer
Who changed what in which revision?
User | Revision | Line number | New 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 | } |