Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: TextLCD mbed-rtos mbed
main.cpp
- Committer:
- lucastai
- Date:
- 2015-09-26
- Revision:
- 1:21958cb07fb4
- Parent:
- 0:65611c1179b6
- Child:
- 2:8bab2e3d3005
File content as of revision 1:21958cb07fb4:
#include "mbed.h"
#include "TextLCD.h"
#include "Mutex.h"
#include "rtos.h"
#include "Thread.h"
using namespace rtos;
//Define LCD
TextLCD lcd(p15, p16, p17, p18, p19, p20, TextLCD::LCD20x4); // rs, e, d4-d7
//Individual Mutex for each chopstick
Mutex chopsticks[5];
// Eating routine
void eat(const int* phil) {
// All chopsticks (0-4) are behind an individual mutex, and must be aquired from lowest to highest
// Each philosopher picks up the chopsticks to his left (index - 1) and right (index % 5), or waits for one
chopsticks[(int)phil - 1].lock();
chopsticks[(int)phil % 5].lock();
//The eating period is between 1000 and 2000 ms
int eatPeriod = rand()%1000 + 1000;
// we locate the part of the LCD
lcd.locate((int)phil,0);
lcd.putc((int)phil + 48);
// The thread waits while the philosopher is eating
Thread::wait(eatPeriod);
//After eating, the philosopher puts down the chopsticks
lcd.locate((int)phil,0);
lcd.printf(" ");
chopsticks[(int)phil - 1].unlock();
chopsticks[(int)phil % 5].unlock();
}
// General thread behavioral routine, eating and waiting (philosophizing)
void philosophizeAndEat(void const *args) {
while (true) {
//Decide a time between 5-10 seconds between eating requests
int waitPeriod = rand()%5000 + 5000;
//Performing the eating routine
eat((const int*)args);
// wait until time elapses to eat again
Thread::wait(waitPeriod);
}
}
// setup routine, create all philosophers
int main() {
// Initialize 5 philosopher threads with IDs
Thread t3(philosophizeAndEat, (void *)3);
Thread t2(philosophizeAndEat, (void *)2);
Thread t4(philosophizeAndEat, (void *)4);
Thread t5(philosophizeAndEat, (void *)5);
philosophizeAndEat((void *)1);
}