C++中向线程传递参数的几次方式

news/2024/11/29 14:55:13/

在C++中,向线程中传递参数有几种方法。以下是其中的几种:

1.使用std::thread构造函数的可变参数模板。可以将要传递的参数作为构造函数的后续参数传递。例如:

#include <iostream>
#include <thread>void func(int a, const std::string& str)
{std::cout << "a = " << a << ", str = " << str << std::endl;
}int main()
{int a = 42;std::string str = "hello";std::thread t(func, a, str);t.join();return 0;
}

在这个例子中,我们使用std::thread构造函数传递两个参数astr给函数func。注意,在传递引用类型的参数时,需要使用std::ref函数来进行引用包装。

2.使用lambda表达式传递参数。可以使用lambda表达式来包装要执行的函数,并将要传递的参数捕获到lambda函数中。例如:

#include <iostream>
#include <thread>int main()
{int a = 42;std::string str = "hello";auto func = [a, &str]{std::cout << "a = " << a << ", str = " << str << std::endl;};std::thread t(func);t.join();return 0;
}

在这个例子中,我们使用lambda表达式来包装要执行的函数,并捕获了参数a和引用类型的参数str。然后,我们将lambda函数传递给std::thread构造函数来创建新线程。

3.使用std::bind绑定参数。可以使用std::bind函数来将要传递的参数绑定到要执行的函数上。例如:

#include <iostream>
#include <thread>
#include <functional>void func(int a, const std::string& str)
{std::cout << "a = " << a << ", str = " << str << std::endl;
}int main()
{int a = 42;std::string str = "hello";auto bind_func = std::bind(func, a, str);std::thread t(bind_func);t.join();return 0;
}

在这个例子中,我们使用std::bind函数将参数astr绑定到函数func上,并返回一个可调用对象bind_func。然后,我们将bind_func传递给std::thread构造函数来创建新线程。

无论哪种方法,传递的参数必须在新线程开始执行之前一直存在,以避免访问悬空指针或引用。另外,使用std::ref来传递引用类型的参数,确保在线程执行期间不会因为参数失效而导致未定义行为。


http://www.ppmy.cn/news/62746.html

相关文章

327页16万字市智慧人社项目建设方案(word可编辑)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除 第 1 章 项目建设总体框架设计 1.1 系统总体架构设计 市智慧人社项目从总体逻辑上可分为信息访问层、门户层、应用服务层、应用支撑层、数据资源层和基础设施层等六个层次&a…

基于SpringBoot3从零配置SpringDoc

为了方便调试&#xff0c;更好的服务于前后端分离式的工作模式&#xff0c;我们给项目引入Swagger。 系列文章指路&#x1f449; 系列文章-基于SpringBoot3创建项目并配置常用的工具和一些常用的类 文章目录 1. SpringFox2. SpringDoc2.1 引入依赖2.2 配置文件2.3 语法2.4 使…

初识MySQL数据库——“MySQL数据库”

各位CSDN的uu们你们好呀&#xff0c;小雅兰好久没有更文啦&#xff0c;确实是心有余而力不足&#xff0c;最近学习的内容太难了&#xff0c;这篇博客又是小雅兰的新专栏啦&#xff0c;主要介绍的是一些MySQL数据库的知识点&#xff0c;下面&#xff0c;让我们进入初识MySQL数据…

DEJA_VU3D - Cesium功能集 之 105-态势标绘补充文件

前言 编写这个专栏主要目的是对工作之中基于Cesium实现过的功能进行整合,有自己琢磨实现的,也有参考其他大神后整理实现的,初步算了算现在有差不多实现小140个左右的功能,后续也会不断的追加,所以暂时打算一周2-3更的样子来更新本专栏(每篇博文都会奉上完整demo的源代码…

前端响应超时、API-server 服务内存不足...碰见这类 DolphinScheduler 资源中心相关问题怎么办?...

作者 | 刘森 卡特加特 大数据工程师 Apache DolphinScheduler Contributor 最近&#xff0c;有些用户小伙伴反映在使用 Apache DolphinScheduler 资源中心时会遇到问题&#xff0c;社区小伙伴整理了一些常见问题&#xff0c;希望帮大家解决燃眉之急。 [WARN] 2023-04-25 03:02…

Qt quick基础2(包含平移旋转放缩以及qml控件大写开头啊)

Qt quick基础2&#xff08;包含平移旋转放缩以及qml控件大写开头啊&#xff09; 目录 Qt quick基础2&#xff08;包含平移旋转放缩以及qml控件大写开头啊&#xff09;前言简单的平移、旋转和放缩其他元素的一些基本使用qml文件作为控件时&#xff0c;务必以大写字母开头命名小结…

多态的原理

有了虚函数&#xff0c;会在类的对象增加一个指针&#xff0c;该指针就是虚函数表指针_vfptr;虚表本质就是函数指针数组,虚表里面存放着该对象的虚函数的地址&#xff1b; 派生类继承有虚函数基类的对象模型 子类继承父类的虚表指针时&#xff0c;是对父类的虚表指针进行了拷…

Python并发编程之多线程

前言 本文介绍并发编程中另一个重要的知识 - 线程。 线程介绍 我们知道一个程序的运行过程是一个进程&#xff0c;在操作系统中每个进程都有一个地址空间&#xff0c;而且每个进程默认有一个控制线程&#xff0c;打个比方&#xff0c;在一个车间中有很多原材料通过流水线加工…