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

创建线程时传递参数给线程

在C++中,可以使用 std::thread 来创建和管理线程,同时可以通过几种方式将参数传递给线程函数。这些方法包括使用值传递、引用传递和指针传递。下面将对这些方法进行详细讲解并给出相应的代码示例。

1. 值传递参数

当你创建线程并希望传递参数时,可以直接将参数作为 std::thread 构造函数的参数传递。这会将参数的副本传递给线程。

示例代码:使用值传递参数

#include <iostream>
#include <thread>void thread_function(int value) {std::cout << "Thread received value: " << value << std::endl;
}int main() {int value_to_pass = 10;std::thread t(thread_function, value_to_pass); // 传递参数t.join(); // 等待线程完成return 0;
}

2. 引用传递参数

如果希望传递参数的引用,以避免复制开销,可以使用 std::ref() 来包装参数。这对于大型对象特别有用。

示例代码:使用引用传递参数

#include <iostream>
#include <thread>
#include <vector>
#include <functional> // 为 std::ref 使用void thread_function(std::vector<int>& vec) {vec.push_back(5); // 修改传入的向量std::cout << "Thread modified vector to include 5." << std::endl;
}int main() {std::vector<int> vec;std::thread t(thread_function, std::ref(vec)); // 传递引用t.join(); // 等待线程完成std::cout << "Vector size after thread: " << vec.size() << std::endl; // 输出:1return 0;
}

3. 传递结构体或类对象

可以通过传递结构体或类对象的方式将多个参数传递给线程。这个过程与使用值传递或引用传递相结合,可以根据需要进行操作。

示例代码:传递结构体作为参数

#include <iostream>
#include <thread>struct ThreadData {int id;std::string message;
};void thread_function(ThreadData data) {std::cout << "Thread " << data.id << ": " << data.message << std::endl;
}int main() {ThreadData data = {1, "Hello from thread!"};std::thread t(thread_function, data); // 传递结构体t.join(); // 等待线程完成return 0;
}

4. 线程接受多个参数

通过将多个参数传递给线程,可以直接在创建 std::thread 时指定多个参数。

示例代码:传递多个参数

#include <iostream>
#include <thread>void thread_function(int a, double b) {std::cout << "Thread received integer: " << a << " and double: " << b << std::endl;
}int main() {std::thread t(thread_function, 42, 3.14); // 传递多个参数t.join(); // 等待线程完成return 0;
}

总结

通过以上示例,我们展示了在C++中创建线程及传递参数的不同方式:

  1. 值传递:直接传递参数的副本。
  2. 引用传递:使用 std::ref() 传递对象的引用,避免复制。
  3. 结构体或类对象:将多个参数封装到一个结构体中进行传递。
  4. 多个参数传递:在创建线程时可以直接传递多个参数。

这种灵活性使得在多线程编程中能够更好地管理数据和资源。根据具体的应用场景,可以选择合适的参数传递方式。

在C++中,除了使用常规的函数作为线程的入口点外,我们还可以使用 lambda 表达式 和 类的成员函数。这两种方式可以使代码更加灵活和简洁。下面将提供示例代码,展示如何使用这两种形式创建线程并传递参数。

1. 使用 Lambda 表达式

Lambda 表达式可以直接在创建线程时定义,非常适合进行简短的任务。在 lambda 中,可以捕获外部变量并将其用于线程中。

示例代码:使用 Lambda 表达式

#include <iostream>
#include <thread>int main() {int value = 42;// 创建线程时使用 lambda 表达式std::thread t([value]() {std::cout << "Thread is running, received value: " << value << std::endl;});t.join(); // 等待线程完成return 0;
}

2. 使用 类的成员函数

如果你有一个对象,并希望使用该对象的成员函数作为线程的入口,可以使用 std::thread 的构造函数将对象的成员函数与对象本身一同传递。必须确保对象在调用之前保持有效。

示例代码:使用类的成员函数

#include <iostream>
#include <thread>class MyClass {
public:void member_function(int value) {std::cout << "Thread running from member function, received value: " << value << std::endl;}
};int main() {MyClass obj;int value = 100;// 创建线程并传递成员函数和对象std::thread t(&MyClass::member_function, &obj, value);t.join(); // 等待线程完成return 0;
}

3. Lambda 表达式与复杂参数

Lambda 表达式还可以接受多个参数,并且可以捕获外部变量,例如引用或指针。下面的示例展示了如何捕获引用。

示例代码:Lambda 表达式捕获引用

#include <iostream>
#include <thread>
#include <vector>int main() {std::vector<int> vec = {1, 2, 3};// 使用 lambda 表达式修改 vectorstd::thread t([&vec]() {vec.push_back(4);std::cout << "Thread modified vector." << std::endl;});t.join(); // 等待线程完成std::cout << "Vector size after thread: " << vec.size() << std::endl; // 输出:4return 0;
}

4. 成员函数与多个参数

可以通过类的成员函数传递多个参数。在实例化 std::thread 时,将这些参数传递给成员函数。

示例代码:成员函数与多个参数

#include <iostream>
#include <thread>class MyClass {
public:void member_function(int a, double b) {std::cout << "Thread from member function, received int: " << a<< " and double: " << b << std::endl;}
};int main() {MyClass obj;// 创建线程并传递成员函数及参数std::thread t(&MyClass::member_function, &obj, 42, 3.14);t.join(); // 等待线程完成return 0;
}

总结

通过以上示例,我们展示了如何使用 lambda 表达式 和 类的成员函数 在C++中创建线程并传递参数。

  • Lambda 表达式:能够快速定义匿名函数,并且能够捕获外部变量。适合简单的任务。
  • 类的成员函数:能在对象的上下文中执行功能,可以通过传递对象的指针来调用它们。适用于需要利用对象状态的情况。

这些方式可以使得多线程编程更灵活、更易读,开发者可以根据具体需求选择合适的方式。

相关文章:

创建线程时传递参数给线程

在C中&#xff0c;可以使用 std::thread 来创建和管理线程&#xff0c;同时可以通过几种方式将参数传递给线程函数。这些方法包括使用值传递、引用传递和指针传递。下面将对这些方法进行详细讲解并给出相应的代码示例。 1. 值传递参数 当你创建线程并希望传递参数时&#xff…...

兴业严选|美国总统都是不良资产出身 法拍市场是否将大众化

北京时间11月6日&#xff0c;特朗普赢得美国大选。 说起特朗普那就不得不提他的发家史&#xff0c;那可真是一笔笔不良资产投资堆出来的。 没错&#xff0c;特朗普就是处理不良资产的高手&#xff0c;战果丰硕。 改造斯威夫特小镇、 康莫德酒店、打造特朗普&#xff08;TRUM…...

C#-拓展方法

概念&#xff1a;为现有的非静态变量类型&#xff0c;添加方法 语法&#xff1a; 访问修饰符 static 返回值 函数名(this 拓展类名 参数名, 参数类型 参数名,参数类型 参数名....){} 而public static void F(this Console()){ }是错的。Console是静态类不可以为静态类添加方…...

加锁失效,非锁之过,加之错也|京东零售供应链库存研发实践

本文导读 从事京东零售供应链库存业务&#xff0c;库存数量操作增减十分频繁&#xff0c;并且项目开发中会常常遇到各种并发情况&#xff0c;一旦库存数量操作有误&#xff0c;势必给前台销售产生损失影响&#xff0c;因此需要关注对库存数量并发操作下的一致性问题。 大部分…...

vue3 传值的几种方式

一.父组件传子组件 父组件 //父组件 <Decisionobject :Decisionselected"Decisionselected"></Decisionobject> <script lang"ts" setup> let Decisionselected ref(false); </script>子组件 <script lang"ts" s…...

AUTOSAR CP NVRAM Manager规范导读

一、NVRAM Manager功能概述 NVRAM Manager是AUTOSAR(AUTomotive Open System ARchitecture)框架中的一个模块,负责管理非易失性随机访问存储器(NVRAM)。它提供了一组服务和API,用于在汽车环境中存储、维护和恢复NV数据。以下是NVRAM Manager的一些关键功能: 数据存储和…...

2024阿里云CTF Web writeup

《Java代码审计》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484219&idx1&sn73564e316a4c9794019f15dd6b3ba9f6&chksmc0e47a67f793f371e9f6a4fbc06e7929cb1480b7320fae34c32563307df3a28aca49d1a4addd&scene21#wechat_redirect 前言 又是周末…...

软件著作权申请教程(超详细)(2024新版)软著申请

目录 一、注册账号与实名登记 二、材料准备 三、申请步骤 1.办理身份 2.软件申请信息 3.软件开发信息 4.软件功能与特点 5.填报完成 一、注册账号与实名登记 首先我们需要在官网里面注册一个账号&#xff0c;并且完成实名认证&#xff0c;一般是注册【个人】的身份。中…...

三维测量与建模笔记 - 3.2 直接线性变换法标定DLT

DLT - Direct Linear Transform 上图中&#xff0c;透视成像对应的公式是共线方程&#xff0c;可以参考以下链接&#xff1a; https://zhuanlan.zhihu.com/p/101549821https://zhuanlan.zhihu.com/p/101549821 对于标定来说&#xff0c;需要找到。已知量是。 (u,v)是…...

Whisper AI视频(音频)转文本

在信息化时代&#xff0c;如何高效处理丰富的音频和视频内容成为了一个重要课题。将这些内容转化为文本不仅能提高信息的可获取性&#xff0c;还能促进更广泛的传播。Whisper Desktop作为一款先进的语音识别工具&#xff0c;能够帮助用户轻松实现音频和视频的转文本功能。 什么…...

全网最详细RabbitMQ教学包括如何安装环境【RabbitMQ】RabbitMQ + Spring Boot集成零基础入门(基础篇)

目录 一、初始Rabbitmq1、什么是Rabbitmq&#xff0c;它的概述是什么&#xff1f;2、RabbitMQ的应用场景3、RabbitMQ主要组件4、RabbitMQ 的优点5、与其他消息队列性能比较 二、RabbitMQ环境安装初始化三、SpringAMQPRabbitMQ实战入门&#xff08;基本API&#xff09;1、实战入…...

esp32记录一次错误

报错信息 PS C:\XingNian\GeRen\4Gdownload\wireless-esp8266-dap> idf.py build Executing action: all (aliases: build) Running cmake in directory c:\xingnian\geren\4gdownload\wireless-esp8266-dap\build Executing "cmake -G Ninja -DPYTHON_DEPS_CHECKED1 …...

Moonshine - 新型开源ASR(语音识别)模型,体积小,速度快,比OpenAI Whisper快五倍 本地一键整合包下载

Moonshine 是由 Useful Sensors 公司推出的一系列「语音到文本&#xff08;speech-to-text, STT&#xff09;转换模型」&#xff0c;旨在为资源受限设备提供快速而准确的「自动语音识别&#xff08;ASR&#xff09;服务」。Moonshine 的设计特别适合于需要即时响应的应用场景&a…...

java-web-苍穹外卖-day1:软件开发步骤简化版+后端环境搭建

软件开发 感觉书本上和线上课程, 讲的太抽象, 不好理解, 但软件开发不就是为了开发应用程序吗?! 干嘛搞这么抽象,对吧, 下面个人对于软件开发的看法, 主打简单易懂, 当然,我一IT界小菜鸟, 对软件开发的认识也很浅显, 这个思维导图也仅仅是现阶段我的看法, 我以后会尽力…...

一个国产 API 开源项目,在 ProductHunt 杀疯了...

随着AI 大模型技术的兴起&#xff0c;全球产品更新和面市进程速度肉眼可见的加快&#xff0c;Product Hunt 作为全球知名的产品发现平台&#xff0c;每日都会精选出一系列产品能力强劲的新产品&#xff0c;这些产品不仅代表了技术前沿&#xff0c;还反映了市场的发展趋势。 上…...

斗破QT编程入门系列之二:认识Qt:编写一个HelloWorld程序(四星斗师)

斗破Qt目录&#xff1a; 斗破Qt编程入门系列之前言&#xff1a;认识Qt&#xff1a;Qt的获取与安装&#xff08;四星斗师&#xff09; 斗破QT编程入门系列之一&#xff1a;认识Qt&#xff1a;初步使用&#xff08;四星斗师&#xff09; 斗破QT编程入门系列之二&#xff1a;认识…...

木马病毒相关知识

1、 木马的定义 相当于一个远控程序&#xff08;一个控制端[hack]、一个被控端[受害端]&#xff09; 在计算机系统中&#xff0c;“特洛伊木马”指系统中被植入的、人为设计的程序&#xff0c;目的包括通过网终远程控制其他用户的计算机系统&#xff0c;窃取信息资料&#xff0…...

用 Python 写了一个天天酷跑(附源码)

Hello&#xff0c;大家好&#xff0c;给大家说一下&#xff0c;我要开始装逼了 这期写个天天酷跑玩一下叭&#xff01; 制作一个完整的“天天酷跑”游戏涉及很多方面&#xff0c;包括图形渲染、物理引擎、用户输入处理、游戏逻辑等。由于Python是一种高级编程语言&#xff0c;…...

【网络-交换机】生成树协议、环路检测

路由优先级 路由优先级决定了在多种可达的路由类型中&#xff0c;哪种路由将被用来转发数据包。路由优先级值越低&#xff0c;对应路由的优先级越高&#xff0c;优先级值255表示对应的路由不可达。一般情况下&#xff0c;静态路由的优先级为1&#xff0c;OSPF路由优先级为110&a…...

C++ 中的 JSON 序列化和反序列化:结构体与枚举类型的处理

在 C 编程中&#xff0c;处理 JSON 数据是一项常见任务&#xff0c;特别是在需要与其他系统或前端进行数据交换时。nlohmann::json 库是一个功能强大且易于使用的 JSON 库&#xff0c;它允许我们轻松地在 C 中进行 JSON 数据的序列化和反序列化。本文将详细介绍如何使用 nlohma…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

离线语音识别方案分析

随着人工智能技术的不断发展&#xff0c;语音识别技术也得到了广泛的应用&#xff0c;从智能家居到车载系统&#xff0c;语音识别正在改变我们与设备的交互方式。尤其是离线语音识别&#xff0c;由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力&#xff0c;广…...