用c++多线程解决哲学家就餐问题
时间: 2023-09-06 08:12:41 浏览: 105
多线程实现哲学家进餐问题
哲学家就餐问题是一个经典的并发编程问题,用来展示多线程编程中的死锁和竞争条件等问题。下面是一个使用C++多线程解决哲学家就餐问题的示例代码:
```c++
#include <iostream>
#include <thread>
#include <mutex>
using namespace std;
const int kNumPhilosophers = 5; // 哲学家数量
mutex forks[kNumPhilosophers]; // 叉子锁
void philosopher(int id) {
int left_fork = id;
int right_fork = (id + 1) % kNumPhilosophers;
// 模拟哲学家思考
cout << "Philosopher " << id << " is thinking." << endl;
this_thread::sleep_for(chrono::seconds(1));
// 尝试获得叉子
cout << "Philosopher " << id << " is hungry and wants to eat." << endl;
forks[left_fork].lock();
forks[right_fork].lock();
// 开始就餐
cout << "Philosopher " << id << " is eating." << endl;
this_thread::sleep_for(chrono::seconds(1));
// 释放叉子
forks[right_fork].unlock();
forks[left_fork].unlock();
// 就餐结束
cout << "Philosopher " << id << " finished eating and is thinking again." << endl;
}
int main() {
// 创建哲学家线程
thread philosophers[kNumPhilosophers];
for (int i = 0; i < kNumPhilosophers; i++) {
philosophers[i] = thread(philosopher, i);
}
// 等待所有哲学家线程结束
for (int i = 0; i < kNumPhilosophers; i++) {
philosophers[i].join();
}
return 0;
}
```
在这个示例代码中,我们使用了`mutex`来实现叉子的锁机制,每个哲学家线程都会先尝试获得左边和右边的叉子,如果获得成功就开始就餐,否则就会等待。这个示例代码简单易懂,但是仍然存在死锁和竞争条件等问题,需要进一步的优化和改进。
阅读全文