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)!
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 }
Generated on Sat Jul 16 2022 02:10:04 by
1.7.2