#pragma once #include #include #include #include #include #include #include #include class Philosopher; typedef std::shared_ptr PhilosopherPtr; typedef std::vector ListOfPhilosophers; typedef std::shared_ptr 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(); };