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

在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; // 输出:1
    return 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 表达式修改 vector
    std::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; // 输出:4
    return 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 表达式:能够快速定义匿名函数,并且能够捕获外部变量。适合简单的任务。
  • 类的成员函数:能在对象的上下文中执行功能,可以通过传递对象的指针来调用它们。适用于需要利用对象状态的情况。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/911290.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

集智书童 | DuoDiff: 提升浅层 Transformer 性能的扩散模型, 双 Backbone 件扩散模型在图像处理中的应用 !

本文来源公众号“集智书童”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;DuoDiff: 提升浅层 Transformer 性能的扩散模型&#xff0c; 双 Backbone 件扩散模型在图像处理中的应用 &#xff01; 扩散模型在图像生成方面取得了前所…

linux perf 环境部署和基本测试(基于Ubuntu20.04)

1,linux 安装perf sudo apt-ge install linux-tools-common sudo apt-get install linux-tools-$(uname -r) linux-tools-generic -y 2 补充安装 sudo apt-get install python3-q-text-as-data 3&#xff0c;perf常用命令 larkubuntu:~$ perf usage: perf [--version] [--hel…

PHP露营地管理平台小程序系统源码

⛺️【露营新风尚】露营地管理平台系统全攻略⛺️ &#x1f3d5;️一、露营热潮下的管理难题&#xff1a;如何高效运营露营地&#xff1f;&#x1f914; 随着露营文化的兴起&#xff0c;越来越多的人选择在大自然中享受宁静与自由。然而&#xff0c;露营地的管理却面临着诸多…

信息安全工程师(83)Windows操作系统安全分析与防护

一、Windows操作系统安全分析 系统漏洞&#xff1a; Windows操作系统由于其复杂性和广泛使用&#xff0c;可能存在一些已知或未知的漏洞。这些漏洞可能会被黑客利用&#xff0c;进行恶意攻击。微软会定期发布系统更新和补丁&#xff0c;以修复这些漏洞&#xff0c;提高系统的安…

软件测试—功能测试详解

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、测试项目启动与研读需求文档 &#xff08;一&#xff09; 组建测试团队 1、测试团队中的角色 2、测试团队的基本责任 尽早地发现软件程序、系统或产…

【1个月速成Java】基于Android平台开发个人记账app学习日记——第7天,申请阿里云SMS短信服务SDK

系列专栏链接如下&#xff0c;方便跟进&#xff1a; https://blog.csdn.net/weixin_62588253/category_12821860.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12821860&sharereferPC&sharesourceweixin_62588253&sharefromfrom_link 同时篇幅…

安装和运行开发微信小程序

下载HBuilder uniapp官网 uni-app官网 微信开发者工具 安装 微信小程序 微信小程序 官网 微信小程序 配置 运行 注意&#xff1a;运行前需要开启服务端口 如果运行看不到效果&#xff0c;设置下基础库选别的版本 配置

如何用pycharm连接sagemath?

#世纪难题在我逃避刷CTF的这两天解决了# 1. 在本地linux上部署最新版的sagemath 推荐WSLdocker直接pull sagemath 2. pycharm中创建jupyter脚本&#xff0c;远程连接jupyter服务器 3. 运行cell并配置kernel 缺点&#xff1a;pycharm用自带的python编译器预处理代码&#xff0…

JNPF V5.1版本震撼上线,更多功能等你解锁!

亲爱的用户们&#xff1a; 随着季节的更迭&#xff0c;引迈也在不断进步和创新。经过数月的精心打磨和无数次的测试&#xff0c;我们非常兴奋地宣布&#xff0c;JNPF快速开发平台迎来了激动人心的V5.1版本更新&#xff01;这次更新不仅带来了全新的功能和改进&#xff0c;还进…

Dependency: androidx.webkit:webkit:1.11.0-alpha02. 问题

android studio 打包后出现这个问题 1.步骤更新topOn sdk 添加 //Admob api “com.anythink.sdk:adapter-admob:6.4.18” api “com.google.android.gms:play-services-ads:23.4.0” api "com.google.android.gms:play-services-ads:23.4.0"sdk 中会出现打包编译报错…

express 使用JWT认证

1、JWT的理解 JWT 的组成部分: 分别是 Header(头部)、Payload(有效荷载)、Signature(签名) 三者之间使用英文的"."分隔, Pyload 部分才是真正的用户信息,他是用户信息经过加密之后生成的字符串 Header 和 Signature 是 安全性相关的部分&#xff0c;只是为了保证 Tok…

【数据结构】LRUCache和跳表{简单讲解+模拟实现}

文章目录 LRUCacheSkipList LRUCache LRU是Least Recently Used的缩写&#xff0c;即最近最少使用&#xff0c;是一种常用的页面置换算法&#xff0c;选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段&#xff0c;用来记录一个页面自上次被访问以来所经历的…

第一个纯血鸿蒙应用(Napi开发-ArtTS调用C/C++)

1.行业背景 纯血鸿蒙&#xff0c;即鸿蒙Next版已于2014年1月正式发版&#xff0c;鸿蒙生态设备数量已经突破10亿台&#xff0c;已经有超过15000个应用和元服务上架。鸿蒙生态不只是移动设备这么简单&#xff0c;他打造的是一个18n的全场景战略&#xff0c;真正做到了“万物互联…

【从零开始的LeetCode-算法】3255. 长度为 K 的子数组的能量值 II

给你一个长度为 n 的整数数组 nums 和一个正整数 k 。 一个数组的 能量值 定义为&#xff1a; 如果 所有 元素都是依次 连续 且 上升 的&#xff0c;那么能量值为 最大 的元素。否则为 -1 。 你需要求出 nums 中所有长度为 k 的 子数组 的能量值。 请你返回一个长度为 n - …

【Linux】进程创建/等待/替换相关知识详细梳理

1. 进程创建 1.1 fork函数 概念&#xff1a;fork函数为系统调用接口&#xff0c;用于从已存在的进程中&#xff0c;创建一个新的进程。新进程为子进程&#xff0c;原来的进程为父进程。 用法&#xff1a; #include <unistd.h> pid_t fork(void); // 返回值&…

CSS例子: 横向排列的格子

效果 HTML <view class"content"><view class"item" v-for"item of 5">{{item}}</view></view> CSS .content {height: 100vh;display: flex;flex-direction: row; flex-wrap: wrap;align-content: flex-start;backgro…

【机器学习】决定系数(R²:Coefficient of Determination)

决定系数&#xff0c;也称为 R 平方&#xff0c;是一种用于衡量回归模型预测效果的统计指标。它表示了模型解释目标变量总变异的程度&#xff0c;数值介于 0 和 1 之间&#xff0c;数值越接近 1 表明模型的解释力越强。 1. 的定义和公式 的公式如下&#xff1a; 其中&#xf…

[免费]SpringBoot+Vue(高校)学籍管理系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue(高校)学籍管理系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue(高校)学籍管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 对在线学籍管理的流程进行科学整理、归纳和…

<项目代码>YOLOv7 草莓叶片病害识别<目标检测>

YOLOv7是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv7具有更高的…

Pinia小菠萝(状态管理器)

Pinia 是一个专为 Vue 3 设计的状态管理库&#xff0c;它借鉴了 Vuex 的一些概念&#xff0c;但更加轻量灵活。下面将详细介绍如何使用 Pinia 状态管理库&#xff1a; 安装 Pinia 使用 npm&#xff1a;在项目目录下运行npm install pinia。使用 yarn&#xff1a;在项目目录下运…