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

std::thread

C++ 11 提供的 std::thread 类

无论是 Linux 还是 Windows 上创建线程的 API,都有一个非常不方便的地方,就是线程函数的签名必须是固定的格式(参数个数和类型、返回值类型都有要求)。C++11 新标准引入了一个新的类std::thread(需要包含头文件<thread>),使用这个类的可以将任何签名形式的函数作为线程函数。以下代码分别创建两个线程,线程函数签名不一样:

#include <stdio.h> #include <thread> void threadproc1() { while (true) { printf("I am New Thread 1!\n"); } } void threadproc2(int a, int b) { while (true) { printf("I am New Thread 2!\n"); } } int main() { //创建线程t1 std::thread t1(threadproc1); //创建线程t2 std::thread t2(threadproc2, 1, 2); while (true) { //Sleep(1000); //权宜之计,让主线程不要提前退出 } return 0; }

当然,std::thread在使用上容易犯一个错误,即在std::thread对象在线程函数运行期间必须是有效的。什么意思呢?我们来看一个例子:

#include <stdio.h> #include <thread> void threadproc() { while (true) { printf("I am New Thread!\n"); } } void func() { std::thread t(threadproc); } int main() { func(); while (true) { //Sleep(1000); //权宜之计,让主线程不要提前退出 } return 0; }

上述代码在func中创建了一个线程,然后又在main函数中调用func方法,乍一看好像代码没什么问题,但是在实际运行时程序会崩溃。崩溃的原因是,当func函数调用结束后,func中局部变量t线程对象)被销毁了,而此时线程函数仍然在运行。这就是我所说的,使用std::thread类时,必须保证线程函数运行期间,其线程对象有效。这是一个很容易犯的错误,解决这个问题的方法是,std::thread对象提供了一个detach方法,这个方法让线程对象线程函数脱离关系,这样即使线程对象被销毁,仍然不影响线程函数的运行。我们只需要在在func函数中调用detach方法即可,代码如下:

//其他代码保持不变,这里就不重复贴出来了 void func() { std::thread t(threadproc); t.detach(); }

然而,在实际编码中,这也是一个不推荐的做法,原因是我们需要使用线程对象去控制和管理线程的运行和生命周期。所以,我们的代码应该尽量保证线程对象在线程运行期间有效,而不是单纯地调用detach方法使线程对象与线程函数的运行分离。

http://www.jsqmd.com/news/1108496/

相关文章:

  • 收藏这份大模型应用开发学习路线图,小白也能半年入门并解决实际问题!
  • XUnity.AutoTranslator:打破语言壁垒的Unity游戏实时翻译架构
  • 2026年AI写论文软件怎么选?从选题到答辩的全流程攻略
  • 当 MCP 把工具接入变成标准动作,科研 Agent 为什么更需要“可调用文档对象”而不只是 Loader
  • vSphere 7.0+虚拟机性能优化终极指南(ESXi底层调度机制深度解密)
  • 2026最权威AI论文工具榜单:这些被高校和导师悄悄推荐的软件你用对了吗
  • 中兴光猫工厂模式破解:5分钟开启永久Telnet访问权限
  • Blender MMD Tools终极指南:跨平台3D动画数据转换完整解决方案
  • 【紧急避坑】VMware Workstation 17.5全屏模式突然失灵?这3个注册表键值必须立即校验!
  • 计算机毕业设计之jsp计算机系统平台
  • 本地部署AI大模型:隐私保护与高效实践指南
  • 2026景德镇黄金回收白银回收铂金回收旧料回收怎么选?五家高实价铂金白银线下门店测评清单 + 联系方式
  • paperxie 学术创作工具箱|分模块论文智能撰写方案,适配全学段学术撰稿需求
  • 3步实现B站视频转文字:你的免费语音识别终极解决方案
  • 5家公司标书同一人制作,3.23亿项目被吊销执照:标书查重为什么是投标企业的生死线?
  • Linux 【05- scp命令超详细教程】
  • Agent Runtime 层重构:会话即事件日志的工程实践与生产落地
  • 遇阻回弹+保温防尘:工业厂房大门优选提升门核心优势解析
  • KMX63与PIC18LF47K40在HMI手势交互中的应用
  • paperxie 学术写作实操指南|对照平台原生界面拆解论文创作全配套功能
  • 分享我的开源项目: 基于Go开发的微服务即时通讯与社交平台
  • SEO 进阶:如何利用 sitemap 在线生成器提升 30% 索引率
  • 三菱Q系列以太网通讯架构赋能城市排水管网智能调度管理系统
  • 收藏!AI时代如何选择值得加入的公司?毕业生必看!
  • Sunshine游戏串流主机:打造你的个人游戏云服务器终极指南
  • AI 图片生成技术解析:扩散模型、多模态与图像编辑的协同机制
  • GetQzonehistory:找回那些被遗忘的QQ空间记忆,一键备份你的数字青春
  • Sunshine游戏串流终极指南:三步打造你的私人云游戏服务器
  • WinAsar:Windows上最轻量的Electron asar文件管理器
  • Dify 1.15 人工介入功能详解:构建可控AI工作流