如何正确更新类成员?五哲学家问题无同步程序开发求助
五哲学家问题类成员更新方案
嘿,我来帮你搞定这个五哲学家类的成员更新问题!从你给出的代码片段来看,你现在刚搭好架子,还在初始阶段,先聚焦思考和进食的基础逻辑对吧?下面一步步教你正确更新类成员:
1. 先补全philosopher类定义
你需要先有一个完整的philosopher类,用来封装思考和进食的行为——毕竟你的dining_philosophers要管理的就是这些哲学家实例嘛。因为暂时不考虑同步,我们可以先在类里实现模拟思考、进食的耗时操作:
class philosopher { private: int id; // 给每个哲学家分配ID,方便区分日志输出 std::mt19937 rng; // 随机数生成器,模拟思考/进食的随机时长 public: // 构造函数:初始化ID和随机数生成器 philosopher(int philo_id) : id(philo_id), rng(std::random_device{}()) {} // 思考行为:随机睡眠1-3秒模拟思考 void think() { std::cout << "哲学家" << id << "正在思考...\n"; std::this_thread::sleep_for(std::chrono::seconds(1 + rng() % 3)); } // 进食行为:随机睡眠1-2秒模拟进食 void eat() { std::cout << "哲学家" << id << "正在进食...\n"; std::this_thread::sleep_for(std::chrono::seconds(1 + rng() % 2)); } };
2. 正确更新dining_philosophers的成员
你之前注释掉了std::vector<philosopher> philosophers;,现在可以把它恢复,再补充初始化逻辑。另外你提到的std::array&l...应该是输入不完整,这里推荐用std::vector(灵活,后续调整哲学家数量更方便),如果固定5个也可以用std::array<philosopher, 5>。
更新后的dining_philosophers类如下:
#pragma once #include <atomic> #include <chrono> #include <mutex> #include <random> #include <thread> #include <vector> // #include <fork.hpp> 暂不考虑叉子逻辑,先注释或保留后续使用 // 先定义philosopher类,或者放在单独头文件引入 class philosopher { // 上面的philosopher类内容 }; class dining_philosophers { public: // 存储哲学家实例的容器 std::vector<philosopher> philosophers; // 构造函数:初始化5个哲学家 dining_philosophers() { for (int i = 0; i < 5; ++i) { // 直接在容器内构造哲学家对象,高效且简洁 philosophers.emplace_back(i); } } // 可选:添加启动所有哲学家行为的方法 void start_simulation() { std::vector<std::thread> philo_threads; // 给每个哲学家分配一个线程,循环执行思考→进食 for (auto& philo : philosophers) { philo_threads.emplace_back([&philo]() { while (true) { philo.think(); philo.eat(); } }); } // 等待所有线程结束(这里是无限循环,实际不会执行到) for (auto& t : philo_threads) { t.join(); } } };
3. 关键注意点
- 确保
philosopher类在dining_philosophers之前定义,或者通过头文件引入,否则编译器会报错找不到类型。 - 用
emplace_back代替push_back构造哲学家对象,避免不必要的拷贝,效率更高。 - 现在你可以先运行这个基础版本,验证思考和进食的逻辑,之后再逐步添加叉子、同步(比如互斥锁、条件变量)的逻辑。
内容的提问来源于stack exchange,提问作者minecraftplayer1234
相关产品推荐
相关产品推荐

