Use a shared queue of X items - One thread adds items at random times - The other thread pulls at random times - They need to synchronize when the queue is full (producer) or empty (consumer)!

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 
00003 typedef struct {
00004     int value;
00005 } message_t;
00006 const int queue_size = 10;
00007 MemoryPool<message_t, queue_size> mpool;
00008 Queue<message_t, queue_size> queue;
00009 int elements_num = 0;
00010 
00011 Mutex mutex;
00012 ConditionVariable cond(mutex);
00013 InterruptIn button(USER_BUTTON);
00014 bool is_button_pressed = false;
00015  
00016 Thread t1;
00017 Thread t2;
00018 Thread t3;
00019 
00020 void start_producer(){
00021     
00022     while (true) 
00023     { 
00024         wait(rand()%3);
00025         mutex.lock();   
00026         int value = rand(); 
00027         while(elements_num == queue_size) {
00028             printf("The queue is full, cannot put.\n");
00029             cond.wait();
00030         } 
00031         message_t *message = mpool.alloc();
00032         message->value = value;
00033         queue.put(message);
00034         elements_num++;
00035         printf("PRODUCER: Put value %d \n", message->value);
00036         cond.notify_all();
00037         mutex.unlock();
00038     }
00039 }
00040 
00041 void start_consumer(){
00042     while (true) 
00043     { 
00044         wait(rand()%10);
00045         mutex.lock();
00046         while(elements_num == 0) {
00047             printf("The queue is empty. Nothing to consume.\n");
00048             cond.wait();
00049         }
00050         osEvent evt = queue.get();
00051         elements_num--;
00052         if (evt.status == osEventMessage) {
00053             message_t *message = (message_t*)evt.value.p;
00054             printf("CONSUMER: I got %d\n", message->value);
00055             mpool.free(message);
00056         }
00057         cond.notify_all();
00058         mutex.unlock();  
00059     }
00060 }
00061 
00062 void toggle (){
00063     is_button_pressed = true;
00064 }
00065 
00066 void print_status(){
00067     while (true) {
00068         if(is_button_pressed){
00069             mutex.lock();
00070             wait(2);
00071             printf("\n\nThere are %d elements in the queue\n\n", elements_num);
00072             wait(2);
00073             mutex.unlock();
00074             is_button_pressed = false;
00075         }
00076     }
00077 }
00078 
00079 int main() {
00080     button.rise(&toggle);
00081     t1.start(&start_producer);
00082     t2.start(&start_consumer);
00083     t3.start(&print_status);
00084 }