赞
踩
封装C++线程通常涉及创建一个类,该类内部使用`std::thread`来管理线程的生命周期,包括启动、执行任务和加入(等待线程结束)。下面是一个简单的线程封装类的示例,演示了如何封装一个线程以执行任意的任务。
这个类将允许你传递一个要在新线程中执行的函数(或任何可调用的对象)。它使用模板来允许任意类型的函数和参数。
- #include <iostream>
- #include <thread>
- #include <functional>
-
- class ThreadWrapper {
- public:
- // 使用模板构造函数允许传递任意类型的可调用对象和参数
- template<typename Callable, typename... Args>
- ThreadWrapper(Callable&& func, Args&&... args) {
- // std::thread的构造函数接受一个可调用对象和其参数
- // std::forward<Args>(args)... 是完美转发参数的标准方式
- thread_ = std::thread(std::forward<Callable>(func), std::forward<Args>(args)...);
- }
-
- // 析构函数确保线程已经加入(或可选地分离)
- ~ThreadWrapper() {
- if (thread_.joinable()) {
- thread_.join(); // 等待线程完成
- }
- }
-
- // 禁止复制构造函数和复制赋值操作符
- ThreadWrapper(const ThreadWrapper&) = delete;
- ThreadWrapper& operator=(const ThreadWrapper&) = delete;
-
- // 允许移动构造函数和移动赋值操作符
- ThreadWrapper(ThreadWrapper&& other) noexcept = default;
- ThreadWrapper& operator=(ThreadWrapper&& other) noexcept = default;
-
- private:
- std::thread thread_; // 封装的std::thread对象
- };
-
- // 示例函数
- void printMessage(const std::string& message) {
- std::cout << message << std::endl;
- }
-
- int main() {
- // 创建一个ThreadWrapper对象,执行printMessage函数
- ThreadWrapper tw(printMessage, "Hello from ThreadWrapper!");
-
- // 在这里,tw的生命周期结束,它的析构函数将被调用,等待线程完成
- return 0;
- }
- **模板构造函数**:允许你传递任意类型的函数和参数到线程。
- **完美转发**:使用`std::forward`来避免不必要的拷贝,保持参数的左值/右值属性。
- **资源管理**:通过析构函数自动管理线程的生命周期
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。