用c++設計哲學家進餐問題的求解
#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;
}
相關文章
- Linux程式設計:程式同步問題之哲學家就餐問題Linux程式設計
- 哲學家就餐問題詳解
- java實現pv操作 -------哲學家問題Java
- 無名訊號量實現哲學家問題
- c++求解李白喝酒問題C++
- 程式設計題求解程式設計
- 程式設計師的哲學程式設計師
- 軟體設計哲學
- 「 思考 」 React Hooks 的設計哲學ReactHook
- 程式語言設計,程式設計哲學程式設計
- 程式設計師的精神家園——碼農餐廳(二)程式設計師
- c++求解獎券題目C++
- 漫談哲學與程式設計程式設計
- 書評:軟體設計哲學
- 程式導向程式設計哲學程式設計
- 軟體設計與哲學,做人
- 非同步與回撥的設計哲學非同步
- Google C++ Style Guide的哲學GoC++GUIIDE
- KDE設區--C++的二進位制相容問題C++
- 樹遞迴問題的求解遞迴
- 深度學習求解「三體」問題,計算速度提高一億倍深度學習
- 從零開始理解 Laravel 的設計哲學Laravel
- Kotlin語言中的泛型設計哲學Kotlin泛型
- 走近宮本茂:遊戲之神的設計哲學遊戲
- Unix哲學(Unix程式設計藝術)程式設計
- Unix程式設計藝術,Unix哲學程式設計
- 求解c++C++
- Go 設計哲學:少即是多,哪裡來的?Go
- 設計模式之Decorator在餐館中的應用設計模式
- 學習設計模式和jive的問題設計模式
- 利用遺傳學演算法求解工作分配問題演算法
- 程式設計師的餐廳程式設計師
- 演算法問題基於蟻群演算法求解求解TSP問題(JAVA)演算法Java
- 實用哲學轉載
- React 進階設計與控制權問題React
- DPLL 演算法(求解k-SAT問題)詳解(C++實現)演算法C++
- [提問交流]OneThink學習日記(更有很多問題求解答!)
- 跟vczh看例項學編譯原理——一:Tinymoe的設計哲學編譯原理