如何用多线程填充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
相关产品推荐
相关产品推荐

