当前位置:   article > 正文

C++线程的封装_c++ 线程类封装

c++ 线程类封装

C++线程的封装_梧桐樹下的博客-CSDN博客_c++线程封装在C中创建线程一般是差不多以下这种形式:void* thread_proc(void* arg){//线程执行过程}int main(void){pthread_t tid;pthread_create(&tid,NULL,thread_proc,...);return 0;}当我们要用C++把其封装成类的时候,可能会写出这样的程序:class Thread{...https://blog.csdn.net/m0_37624402/article/details/96508820

封装C++线程通常涉及创建一个类,该类内部使用`std::thread`来管理线程的生命周期,包括启动、执行任务和加入(等待线程结束)。下面是一个简单的线程封装类的示例,演示了如何封装一个线程以执行任意的任务。

线程封装类

这个类将允许你传递一个要在新线程中执行的函数(或任何可调用的对象)。它使用模板来允许任意类型的函数和参数。

  1. #include <iostream>
  2. #include <thread>
  3. #include <functional>
  4. class ThreadWrapper {
  5. public:
  6. // 使用模板构造函数允许传递任意类型的可调用对象和参数
  7. template<typename Callable, typename... Args>
  8. ThreadWrapper(Callable&& func, Args&&... args) {
  9. // std::thread的构造函数接受一个可调用对象和其参数
  10. // std::forward<Args>(args)... 是完美转发参数的标准方式
  11. thread_ = std::thread(std::forward<Callable>(func), std::forward<Args>(args)...);
  12. }
  13. // 析构函数确保线程已经加入(或可选地分离)
  14. ~ThreadWrapper() {
  15. if (thread_.joinable()) {
  16. thread_.join(); // 等待线程完成
  17. }
  18. }
  19. // 禁止复制构造函数和复制赋值操作符
  20. ThreadWrapper(const ThreadWrapper&) = delete;
  21. ThreadWrapper& operator=(const ThreadWrapper&) = delete;
  22. // 允许移动构造函数和移动赋值操作符
  23. ThreadWrapper(ThreadWrapper&& other) noexcept = default;
  24. ThreadWrapper& operator=(ThreadWrapper&& other) noexcept = default;
  25. private:
  26. std::thread thread_; // 封装的std::thread对象
  27. };
  28. // 示例函数
  29. void printMessage(const std::string& message) {
  30. std::cout << message << std::endl;
  31. }
  32. int main() {
  33. // 创建一个ThreadWrapper对象,执行printMessage函数
  34. ThreadWrapper tw(printMessage, "Hello from ThreadWrapper!");
  35. // 在这里,tw的生命周期结束,它的析构函数将被调用,等待线程完成
  36. return 0;
  37. }

关键点

- **模板构造函数**:允许你传递任意类型的函数和参数到线程。
- **完美转发**:使用`std::forward`来避免不必要的拷贝,保持参数的左值/右值属性。
- **资源管理**:通过析构函数自动管理线程的生命周期

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/555648
推荐阅读
相关标签
  

闽ICP备14008679号