You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确更新类成员?五哲学家问题无同步程序开发求助

五哲学家问题类成员更新方案

嘿,我来帮你搞定这个五哲学家类的成员更新问题!从你给出的代码片段来看,你现在刚搭好架子,还在初始阶段,先聚焦思考和进食的基础逻辑对吧?下面一步步教你正确更新类成员:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:46:08