当前位置: 首页 > news >正文

C++ Thread多线程并发记录(3)线程创建总结

1.启动线程传递全局函数

#include <iostream>
#include <thread>void Th1(int id){std::cout << "Create global fun. id = " << id << std::endl;
}
void TH1(const int &id){std::cout << "Create global fun. id = " << id << std::endl;
}int main() {std::thread th1(Th1, 1);const int &num = 2;std::thread th2(Th1,std::ref(num));th1.join();//等待子线程结束后汇聚,注意同一个thread对象join两次会产生未定义行为th2.join();//th2.detach();//detach方法将线程变为守护进程,有可能出现主线程结束后,子线程还未结束的情况,故而不要使用detach线程访问栈内存return 0;
}

2.启动线程传递类成员函数

#include <iostream>
#include <string>
#include <thread>class TH1{
public:void print(){std::cout << name << std::endl;}std::string name{};
};
class TH2{
public:void operator()(std::string name) {std::cout << name << std::endl;}
};int main() {TH1 t1;t1.name = "this is thread 1.";std::thread th1(&TH1::print, &t1);//传递类成员函数地址以及类实例地址std::thread th2((TH2()), "this is thread 2.");th1.join();th2.join();return 0;
}

3.传递Lambda表达式

#include <iostream>
#include <string>
#include <thread>int main() {std::string name{"This is thread 1."};std::thread t1([](const std::string &s){ std::cout << s << std::endl; }, std::ref(name));t1.join();return 0;
}

4.Thread RAII管理线程

#include <iostream>
#include <string>
#include <memory>
#include <vector>
#include <thread>class Thread_join {
public:Thread_join() = default;virtual ~Thread_join() = default;virtual void start() {thread_ = std::thread(&Thread_join::do_something, this); //传入基类指针产生动态绑定,根据动态类型选择虚函数类型};virtual void wait(){if (thread_.joinable())thread_.join();}
protected:std::thread thread_; //使用智能指针管理thread需要自定义virtual void do_something() = 0; //类中方法声明为纯虚函数
};class TH1 : public Thread_join {
public:void do_something() override {for (const auto &i : s)std::cout << i << " ";}
private:std::vector<std::string> s{"This", "is", "thread", "RAII"};
};int main() {TH1 t;t.start();t.wait();return 0;
}
#include <iostream>
#include <string>
#include <vector>
#include <thread>class Thread_join {
public:Thread_join() = default;virtual ~Thread_join(){if (thread_.joinable())thread_.join();}virtual void start() {thread_ = std::thread(&Thread_join::do_something, this); //传入基类指针产生动态绑定,根据动态类型选择虚函数类型};virtual void wait(){if (thread_.joinable())thread_.join();}
protected:std::thread thread_; //使用智能指针管理thread需要自定义virtual void do_something() = 0; //类中方法声明为纯虚函数
};class TH1 : public Thread_join {
public:~TH1() override{if (thread_.joinable())thread_.join();}void do_something() override {for (const auto &i : s)std::cout << i << " ";}
private:std::vector<std::string> s{"This", "is", "thread", "RAII"};
};int main() {TH1 t;t.start();return 0;
}

相关文章:

  • 基础—SQL—DML(数据操作语言)修改和删除
  • 力扣----轮转数组
  • 重学java 61.IO流 ② 字节输出流
  • 【面试宝藏】Redis 常见面试题解析
  • 如何通过PHP语言实现远程控制多路照明
  • 利用BeanFactoryPostProcessor让Bean提前被创建
  • 汽车IVI中控开发入门及进阶(二十四):杰发科技AC8015
  • 高通Android 12/13实现USB拔出关机功能
  • 了解CSS中的link和@import引入CSS的区别
  • Linux搭建PHP下的RabbitMQ环境(php-amqp/rabbitmq-c/erlang)
  • 如何管理和维护组件库?
  • WPF实现简单的3D图形
  • Android ViewPager和ViewPager2的区别
  • jenkins插件之plot
  • TypeScript 在前端开发中的应用
  • 【Leetcode】101. 对称二叉树
  • 【comparator, comparable】小总结
  • 0x05 Python数据分析,Anaconda八斩刀
  • 2019年如何成为全栈工程师?
  • 3.7、@ResponseBody 和 @RestController
  • Akka系列(七):Actor持久化之Akka persistence
  • docker-consul
  • leetcode46 Permutation 排列组合
  • Python 基础起步 (十) 什么叫函数?
  • 高程读书笔记 第六章 面向对象程序设计
  • 如何使用 JavaScript 解析 URL
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 实现菜单下拉伸展折叠效果demo
  • 使用 QuickBI 搭建酷炫可视化分析
  • ​zookeeper集群配置与启动
  • ​数据结构之初始二叉树(3)
  • !!Dom4j 学习笔记
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #QT 笔记一
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (13)DroneCAN 适配器节点(一)
  • (2)nginx 安装、启停
  • (2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (PySpark)RDD实验实战——取最大数出现的次数
  • (八)c52学习之旅-中断实验
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (图)IntelliTrace Tools 跟踪云端程序
  • (一)SvelteKit教程:hello world
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (源码分析)springsecurity认证授权
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .gitignore文件使用
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .NET Framework杂记
  • .net操作Excel出错解决
  • .NET正则基础之——正则委托