#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#include<iostream>
#include<unistd.h>
#include<semaphore.h>
#define N 5
#define LEFT i
#define RIGHT (i+1)%N
using namespace std;
class Semaphore{
private:
sem_t sem;
public:
Semaphore(int value=1){
sem_init(&sem,0,value);
}
void P(){
sem_wait(&sem);
}
void V(){
sem_post(&sem);
}
};
Semaphore mutex[N];
pthread_t thread[N];
int id[N];
int add=0;
void* solve(void*param){
int i =*((int*)param);
while(true){
if(add>=30){
cout<<"noodles is over"<<endl;
break;
}
cout<<"philo"<<i<<" thinking"<<endl;
if(i%2==0){
mutex[LEFT].P();
mutex[RIGHT].P();
cout<<"philo"<<i<<" eatting"<<endl;
add++;
cout<<add<<endl;
mutex[RIGHT].V();
mutex[LEFT].V();
}else{
mutex[RIGHT].P();
mutex[LEFT].P();
cout<<"philo"<<i<<" eatting"<<endl;
add++;
cout<<add<<endl;
mutex[LEFT].V();
mutex[RIGHT].V();
}
sleep(1);
}
}
void thread_create(){
int tmp;
for(int i=0; i<N; i++){
tmp=pthread_create(&thread[i],NULL,solve,&id[i]);
if(tmp!=0){
cout<<"thread"<<i<<"error"<<endl;
}
}
}
void thread_wait(){
for(int i=0; i<N; i++){
pthread_join(thread[i],NULL);
}
}
int main(){
for(int i=0; i<N; i++){
id[i]=i;
}
thread_create();
thread_wait();
return 0;
}