64 lines
1.1 KiB
C++
64 lines
1.1 KiB
C++
#pragma once
|
|
#include <thread>
|
|
#include <vector>
|
|
#include <memory>
|
|
#include <mutex>
|
|
#include <iostream>
|
|
#include <semaphore>
|
|
|
|
#include <random.hpp>
|
|
#include <philosopher-state.hpp>
|
|
|
|
class Philosopher;
|
|
|
|
typedef std::shared_ptr<Philosopher> PhilosopherPtr;
|
|
typedef std::vector<PhilosopherPtr> ListOfPhilosophers;
|
|
typedef std::shared_ptr<ListOfPhilosophers> ListOfPhilosophersPtr;
|
|
extern std::mutex changingForkState;
|
|
extern std::mutex printing;
|
|
|
|
class Philosopher {
|
|
private:
|
|
int numberOfPhilosopher;
|
|
|
|
PhilosopherState state{PhilosopherState::THINKING};
|
|
|
|
ListOfPhilosophersPtr philosophers;
|
|
|
|
void
|
|
setState(PhilosopherState state);
|
|
|
|
size_t
|
|
leftPhilosopherNumber(void);
|
|
|
|
size_t
|
|
rightPhilosopherNumber(void);
|
|
|
|
PhilosopherPtr
|
|
leftPhilosopher(void);
|
|
|
|
PhilosopherPtr
|
|
rightPhilosopher(void);
|
|
|
|
void
|
|
think();
|
|
|
|
void
|
|
takeForks();
|
|
|
|
void
|
|
eat();
|
|
|
|
void
|
|
putForks();
|
|
|
|
public:
|
|
PhilosopherState
|
|
getState();
|
|
Philosopher(ListOfPhilosophersPtr philosophers, int numberOfPhilosopher);
|
|
std::binary_semaphore hasBothForks{0};
|
|
void startThread();
|
|
void test();
|
|
};
|
|
|