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

C++线程操作

C++线程操作

  • 定义
  • 构造函数
    • 1、通过函数指针
    • 2、通过Lambda 表达式
    • 3、通过成员函数
    • 4、拷贝构造函数
    • 5、移动构造函数

定义

std::thread必须明确调用join()detach(),否则程序终止时会调用std::terminate()

特性std::threadstd::jthread
引入标准C++11C++20
资源管理析构时若仍可汇合(joinable)会‌调用std::terminate终止程序析构时若仍可汇合,会‌**自动调用join()**‌,等待线程结束
协作中断不支持‌ 原生协作中断机制支持‌,通过 request_stop() 请求停止,线程内可查询停止状态
成员函数join()detach()get_id()joinable()包含std::thread所有功能,并增加 request_stop()get_stop_source()get_stop_token()
推荐使用旧代码维护,或需要手动控制线程生命周期新项目首选‌,更安全,资源管理更自动化
void sayHello() {std::this_thread::sleep_for(std::chrono::seconds(3));std::cout << getStringFromU8string(u8"Hello World,子线程, threadId=") + getThreadIdAsString() + "\n";
}int main()
{system("chcp 65001");std::cout << getStringFromU8string(u8"开始主线程,threadId=") << std::this_thread::get_id() << endl;std::thread thread1(sayHello);//std::jthread thread2(sayHello);// thread必须显式调用// thread1.join();// // jthread会自动调用join方法//thread2.join();std::cout << getStringFromU8string(u8"结束主线程,threadId=") << std::this_thread::get_id() << endl;return 0;
}

构造函数

1、通过函数指针

带返回值的函数,需要用到其他方式

#include <iostream>
#include <string>
#include <thread>using namespace std;
std::string getStringFromU8string(const std::u8string& u8str) {return std::string(reinterpret_cast<const char*>(u8str.data()), u8str.size());
}std::u8string getU8stingFromString(const std::string& str) {return std::u8string(reinterpret_cast<const char8_t*>(str.data()), str.size());
}void sayHello() {std::cout << getStringFromU8string(u8"Hello World,子线程, threadId=") << std::this_thread::get_id() << endl;
}void add(int a, int b) {std::cout << getStringFromU8string(u8"Hello World,子线程, threadId=") << std::this_thread::get_id() << " ;a+b=" << (a + b) << endl;
}int main()
{system("chcp 65001");std::cout << getStringFromU8string(u8"开始主线程,threadId=") << std::this_thread::get_id() << endl;// 无参,无返回std::thread thread1(sayHello);// 有参,无返回std::thread thread2(add, 2, 3);// 等待线程结束(阻塞主线程)thread1.join();thread2.join();std::cout << getStringFromU8string(u8"结束主线程,threadId=") << std::this_thread::get_id() << endl;return 0;
}

2、通过Lambda 表达式

int main()
{system("chcp 65001");std::cout << getStringFromU8string(u8"开始主线程,threadId=") << std::this_thread::get_id() << endl;// 无参,无返回std::thread thread1([]() {std::cout << getStringFromU8string(u8"Hello World,子线程, threadId=") << std::this_thread::get_id() << endl; });// 有参,无返回std::thread thread2([](int a, int b) {std::cout << getStringFromU8string(u8"Hello World,子线程, threadId=") << std::this_thread::get_id() << " ;a+b=" << (a + b) << endl; }, 2, 3);// 等待线程结束(阻塞主线程)thread1.join();thread2.join();std::cout << getStringFromU8string(u8"结束主线程,threadId=") << std::this_thread::get_id() << endl;return 0;
}

3、通过成员函数

#include <iostream>
#include <string>
#include <thread>
#include <sstream>using namespace std;
std::string getStringFromU8string(const std::u8string& u8str) {return std::string(reinterpret_cast<const char*>(u8str.data()), u8str.size());
}std::u8string getU8stingFromString(const std::string& str) {return std::u8string(reinterpret_cast<const char8_t*>(str.data()), str.size());
}std::string getThreadIdAsString() {std::stringstream ss;ss << std::this_thread::get_id();return ss.str();
}class Hello {
public:void sayHello() {std::cout << getStringFromU8string(u8"Hello World,子线程, threadId=") + getThreadIdAsString() + "\n";}void add(int a, int b) {std::cout << getStringFromU8string(u8"Hello World,子线程, threadId=") + getThreadIdAsString() + " ;a+b=" + std::to_string(a + b) + "\n";}static void staticAdd(int a, int b) {std::cout << getStringFromU8string(u8"Hello World,子线程, threadId=") + getThreadIdAsString() + " ;a+b=" + std::to_string(a + b) + "\n";}
};int main()
{system("chcp 65001");std::cout << getStringFromU8string(u8"开始主线程,threadId=") << std::this_thread::get_id() << endl;Hello hello;// 无参,无返回std::thread thread1(&Hello::sayHello, &hello);// 有参,无返回std::thread thread2(&Hello::add, &hello, 2, 3);// 有参,无返回(静态方法)std::thread thread3(&Hello::staticAdd, 5, 6);// 等待线程结束(阻塞主线程)thread1.join();thread2.join();thread3.join();std::cout << getStringFromU8string(u8"结束主线程,threadId=") << std::this_thread::get_id() << endl;return 0;
}

4、拷贝构造函数

已删除,不支持

5、移动构造函数

int main()
{system("chcp 65001");std::cout << getStringFromU8string(u8"开始主线程,threadId=") << std::this_thread::get_id() << endl;Hello hello;std::thread thread1(&Hello::sayHello, &hello);// 移动构造函数,原thread1失效不可用了std::thread thread2(std::move(thread1));// 等待线程结束(阻塞主线程)// thread1.join();thread2.join();std::cout << getStringFromU8string(u8"结束主线程,threadId=") << std::this_thread::get_id() << endl;return 0;
}
http://www.dtcms.com/a/589591.html

相关文章:

  • 培训网站网站建设上海 网站建设google
  • OpenCV 第10课 图像处理—阈值处理
  • 力扣刷题-借助哈希完成一次遍历
  • 网络图标误报?电脑显示无网却能上网的快速修复法
  • 二七区做网站动画设计培训机构
  • 做网站九州科技哈尔滨网络公司定制开发
  • 链动2+1模式、AI智能名片与S2B2C商城小程序:破解直播电商流量转化困局的创新路径
  • 建设网站基本思路系统页面模板
  • 怎样制作属于自己的网站app排版网站
  • 福建设计招聘网站网站服务设计
  • zabbix结合grafana打造自定义炫酷监控界面实战
  • 网站建设的安全性问题宁波网站建设 网络服务
  • 网站asp文件只读做网站的目的和要求
  • Git_log_查看文件的修改记录不完整
  • 计算机网络---安全外壳协议(SSH,Secure Shell)
  • 从0到1学习Qt -- 常见控件(一)
  • java小案例3
  • wordpress支付界面出现500如何做网站seo排名优化
  • 基于Spring Boot电子签平台,实名认证+CA证书
  • 052_小驰私房菜_MTK 平台可能可以提升camera帧率的一些修改
  • 多天线技术
  • 聊城市网站制作江门做网站多少钱
  • 行为型设计模式1
  • MATLAB实现白噪声与色噪声仿真
  • 甘德县公司网站建设工业设计公司如何运营
  • JAVA-Redis上
  • 免费空间 上传网站虚拟主机推荐
  • mysql配置主从同步
  • 基于SpringBoot+Vue+协同过滤算法的在线旅游系统
  • 【高并发服务器:HTTP应用】十六、HttpContext上下文模块 HttpServer服务器模块 服务器测试