dining-philosophers/include/philosopher.hpp

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