in class exercise

main.cpp

Committer:
iandil
Date:
2018-11-16
Revision:
0:35457e400d4c

File content as of revision 0:35457e400d4c:

#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();
}