in class exercise

Committer:
iandil
Date:
Fri Nov 16 14:57:57 2018 +0000
Revision:
0:35457e400d4c
producer consumer threadsafed

Who changed what in which revision?

UserRevisionLine numberNew 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 }