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