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

如何用多线程填充unique_ptr类型的vector容器?

我帮你把这套多设备管理的代码结构用清晰的Markdown格式整理出来啦,结合你的需求,每个部分的作用和代码都一目了然:

多设备管理的类结构设计

1. 设备标识结构体 device_id

这个结构体就是设备的“身份证”,存着能唯一识别设备的关键信息,比如序列号、总线地址之类的:

struct device_id {
    // 可根据实际需求补充字段
    std::string serial_number;
    int bus_address;

    // 可以加个比较运算符,方便判断是不是同一个设备
    bool operator==(const device_id& other) const {
        return serial_number == other.serial_number && bus_address == other.bus_address;
    }
};

2. 设备操作类 device

单个设备的所有操作都靠这个类管:构造函数传入device_id来初始化并连接设备,析构函数会自动关闭设备释放资源。而且我们特意禁用了复制操作(或者靠unique_ptr自动限制),避免不小心复制设备对象导致资源混乱:

class device {
public:
    // 构造函数:传入设备ID,完成设备初始化/连接
    explicit device(const device_id& id) {
        // 这里写实际的设备初始化逻辑,比如打开设备句柄、建立通信
        std::cout << "正在初始化设备:" << id.serial_number << std::endl;
    }

    // 析构函数:自动关闭设备,释放占用的资源
    ~device() {
        // 这里写设备关闭逻辑,比如断开连接、释放句柄
        std::cout << "正在关闭设备" << std::endl;
    }

    // 示例:设备操作方法,根据需求添加
    void send_command(const std::string& cmd) {
        // 实现给设备发命令的逻辑
    }

    std::string read_response() {
        // 实现读取设备响应的逻辑
        return "";
    }

    // 禁止复制操作,防止资源重复释放
    device(const device&) = delete;
    device& operator=(const device&) = delete;
    // 允许移动操作,方便unique_ptr管理
    device(device&&) = default;
    device& operator=(device&&) = default;
};

3. 设备枚举器类 device_enumerator

这个类专门负责“扫货”——遍历系统里所有已连接的设备,然后为每个设备创建unique_ptr<device>实例。用unique_ptr的好处就是完全不用手动管释放,它会在对象生命周期结束时自动调用device的析构函数,完美避免资源泄漏:

#include <vector>
#include <memory>

class device_enumerator {
public:
    // 枚举所有已连接设备,返回一个装着unique_ptr的列表
    std::vector<std::unique_ptr<device>> enumerate_devices() {
        std::vector<std::unique_ptr<device>> devices;

        // 第一步:扫描系统,拿到所有已连接设备的ID
        std::vector<device_id> detected_ids = scan_for_devices();

        // 第二步:给每个ID创建device实例,用unique_ptr托管
        for (const auto& id : detected_ids) {
            devices.emplace_back(std::make_unique<device>(id));
        }

        return devices;
    }

private:
    // 内部方法:实现实际的设备扫描逻辑
    std::vector<device_id> scan_for_devices() {
        std::vector<device_id> ids;
        // 这里写真实的设备扫描代码,比如遍历系统总线、查询设备列表
        // 下面是模拟检测到两台设备的示例
        ids.push_back({"DEVICE_001", 1});
        ids.push_back({"DEVICE_002", 2});
        return ids;
    }
};

4. 使用示例

看看怎么用这套结构:

#include <iostream>

int main() {
    device_enumerator enumerator;
    auto devices = enumerator.enumerate_devices();

    // 操作第一个设备示例
    if (!devices.empty()) {
        devices[0]->send_command("查询状态");
        std::string resp = devices[0]->read_response();
        std::cout << "设备响应:" << resp << std::endl;
    }

    // 当devices离开main函数的作用域时,unique_ptr会自动销毁所有device对象,调用析构函数关闭设备
    return 0;
}

内容的提问来源于stack exchange,提问作者DevSolar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:41:32