哲学家进餐问题c++代码
时间: 2023-09-07 07:14:50 浏览: 289
下面是哲学家进餐问题的一个示例 C++ 代码:
```c++
#include <iostream>
#include <thread>
#include <mutex>
using namespace std;
mutex forks[5]; // 五个叉子
int philosopher_state[5]; // 哲学家的状态,0 表示思考,1 表示饥饿,2 表示就餐
// 哲学家线程函数,参数为哲学家的编号
void philosopher(int num) {
int left_fork = num; // 左边的叉子编号
int right_fork = (num + 1) % 5; // 右边的叉子编号
while (true) {
// 思考
philosopher_state[num] = 0;
cout << "Philosopher " << num << " is thinking." << endl;
this_thread::sleep_for(chrono::milliseconds(500));
// 饥饿
philosopher_state[num] = 1;
cout << "Philosopher " << num << " is hungry." << endl;
// 尝试拿起左边的叉子
forks[left_fork].lock();
cout << "Philosopher " << num << " picks up fork " << left_fork << " (left)." << endl;
// 尝试拿起右边的叉子
forks[right_fork].lock();
cout << "Philosopher " << num << " picks up fork " << right_fork << " (right)." << endl;
// 就餐
philosopher_state[num] = 2;
cout << "Philosopher " << num << " is eating." << endl;
this_thread::sleep_for(chrono::milliseconds(1000));
// 放下左边的叉子
forks[left_fork].unlock();
cout << "Philosopher " << num << " puts down fork " << left_fork << " (left)." << endl;
// 放下右边的叉子
forks[right_fork].unlock();
cout << "Philosopher " << num << " puts down fork " << right_fork << " (right)." << endl;
}
}
int main() {
// 初始化哲学家状态
for (int i = 0; i < 5; i++) {
philosopher_state[i] = 0;
}
// 创建五个哲学家线程
thread t0(philosopher, 0);
thread t1(philosopher, 1);
thread t2(philosopher, 2);
thread t3(philosopher, 3);
thread t4(philosopher, 4);
// 等待五个哲学家线程结束
t0.join();
t1.join();
t2.join();
t3.join();
t4.join();
return 0;
}
```
在这个示例代码中,五个叉子用一个互斥量数组 `forks` 来表示,哲学家的状态用一个整型数组 `philosopher_state` 来表示,0 表示思考,1 表示饥饿,2 表示就餐。哲学家的线程函数 `philosopher` 中,首先进行思考,然后尝试拿起左边的叉子和右边的叉子,如果成功,则就餐一段时间后放下叉子;如果失败,则等待一段时间后重试。在拿起和放下叉子时,需要使用互斥量来保证同一时间只有一个哲学家能够拿起或放下叉子。最后,创建五个哲学家线程并等待它们结束。
阅读全文