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

c++线程传参

在C++中,可以使用std::thread的构造函数来向线程传递参数。这里有一个示例:

#include <iostream>
#include <thread>// 定义一个被线程调用的函数
void threadFunc(int arg1, double arg2, std::string arg3)
{std::cout << "arg1: " << arg1 << ", arg2: " << arg2 << ", arg3: " << arg3 << std::endl;
}int main()
{// 创建一个线程,并传递参数std::thread t(threadFunc, 1, 3.14, "Hello, World!");// 等待线程结束t.join();return 0;
}

在这个例子中,定义了一个函数threadFunc,它接受三个参数。然后在main函数中创建了一个线程,并将这三个参数传递给了threadFunc

但是,如果的函数不接受参数,或者想要传递的参数数量不确定,可以使用std::refstd::cref来传递引用。例如:

#include <iostream>
#include <thread>// 定义一个被线程调用的函数
void threadFunc(int &arg1, double &arg2, std::string &arg3)
{std::cout << "arg1: " << arg1 << ", arg2: " << arg2 << ", arg3: " << arg3 << std::endl;
}int main()
{int arg1 = 1;double arg2 = 3.14;std::string arg3 = "Hello, World!";// 创建一个线程,并传递参数引用std::thread t(threadFunc, std::ref(arg1), std::ref(arg2), std::ref(arg3));// 等待线程结束t.join();return 0;
}

在这个例子中,使用std::ref来传递变量的引用,这样就可以在threadFunc中修改这些变量的值。
std::refstd::cref 是 C++11 引入的,用于在 std::bind 或者 std::async 中引用成员函数或者非成员函数。这些函数主要在多线程中使用,目的是在函数调用中保持对象的引用,而不是复制对象。

  1. std::ref:
    std::ref 用于在函数绑定或异步函数调用中引用非const对象。这实际上允许通过引用而不是值来传递对象。例如,在多线程中,如果想在另一个线程中调用一个对象的成员函数,并且这个对象不是常量的,可以使用 std::ref 来传递这个对象的引用。

    示例:

    std::thread t(func, std::ref(myObj));
    
  2. std::cref:
    std::cref 类似于 std::ref,但它是用于引用const对象的。这意味着将通过const引用传递对象,不能在被调用的函数中修改这个对象。这在希望保证对象不会被改变时很有用。

    示例:

    std::thread t(func, std::cref(myObj));
    

这两个函数都定义在 <functional> 头文件中,因此在使用它们之前,必须包含这个头文件。它们实际上返回一个 reference_wrapper 对象,可以将这个对象传递给 std::bind 或 std::async,或者在其他需要函数调用的地方使用。

在C++中,可以使用std::thread的构造函数来向线程传递参数。这里有一个示例:

#include <iostream>
#include <thread>// 定义一个被线程调用的函数
void threadFunc(int arg1, double arg2, std::string arg3)
{std::cout << "arg1: " << arg1 << ", arg2: " << arg2 << ", arg3: " << arg3 << std::endl;
}int main()
{// 创建一个线程,并传递参数std::thread t(threadFunc, 1, 3.14, "Hello, World!");// 等待线程结束t.join();return 0;
}

在这个例子中,定义了一个函数threadFunc,它接受三个参数。然后在main函数中创建了一个线程,并将这三个参数传递给了threadFunc

但是,如果的函数不接受参数,或者想要传递的参数数量不确定,可以使用std::refstd::cref来传递引用。例如:

#include <iostream>
#include <thread>// 定义一个被线程调用的函数
void threadFunc(int &arg1, double &arg2, std::string &arg3)
{std::cout << "arg1: " << arg1 << ", arg2: " << arg2 << ", arg3: " << arg3 << std::endl;
}int main()
{int arg1 = 1;double arg2 = 3.14;std::string arg3 = "Hello, World!";// 创建一个线程,并传递参数引用std::thread t(threadFunc, std::ref(arg1), std::ref(arg2), std::ref(arg3));// 等待线程结束t.join();return 0;
}

在这个例子中,使用std::ref来传递变量的引用,这样就可以在threadFunc中修改这些变量的值。
std::refstd::cref 是 C++11 引入的,用于在 std::bind 或者 std::async 中引用成员函数或者非成员函数。这些函数主要在多线程中使用,目的是在函数调用中保持对象的引用,而不是复制对象。

  1. std::ref:
    std::ref 用于在函数绑定或异步函数调用中引用非const对象。这实际上允许通过引用而不是值来传递对象。例如,在多线程中,如果想在另一个线程中调用一个对象的成员函数,并且这个对象不是常量的,可以使用 std::ref 来传递这个对象的引用。

    示例:

    std::thread t(func, std::ref(myObj));
    
  2. std::cref:
    std::cref 类似于 std::ref,但它是用于引用const对象的。这意味着将通过const引用传递对象,不能在被调用的函数中修改这个对象。这在希望保证对象不会被改变时很有用。

    示例:

    std::thread t(func, std::cref(myObj));
    

这两个函数都定义在 <functional> 头文件中,因此在使用它们之前,必须包含这个头文件。它们实际上返回一个 reference_wrapper 对象,可以将这个对象传递给 std::bind 或 std::async,或者在其他需要函数调用的地方使用。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • KCache-go本地缓存,支持本地缓存过期、缓存过期自维护机制。
  • Chrome谷歌浏览器Console(控制台)显示文件名及行数
  • Open3D 计算点云的占地面积
  • HarmonyOS NEXT零基础入门到实战-第四部分
  • 速盾:cdn能防御ddos吗?
  • Codeforces Round 874 (Div. 3)(A~D题)
  • 掌握AJAX技术:从基础到实战
  • reduceByKey 函数详解
  • 1-如何挑选Android编译服务器
  • Git拉取国外远程嵌套代码
  • Kylin自定义函数全解:释放数据分析的无限潜能
  • 【Web】LitCTF 2024 题解(全)
  • JavaScript数据筛选和模糊搜索
  • Infuse Pro for Mac全能视频播放器
  • PySide(PyQt)的QPropertyAnimation(属性动画)的应用实践
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • bearychat的java client
  • chrome扩展demo1-小时钟
  • css属性的继承、初识值、计算值、当前值、应用值
  • Docker: 容器互访的三种方式
  • Node + FFmpeg 实现Canvas动画导出视频
  • Python利用正则抓取网页内容保存到本地
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • spring cloud gateway 源码解析(4)跨域问题处理
  • 初识MongoDB分片
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 温故知新之javascript面向对象
  • Spring第一个helloWorld
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (1)SpringCloud 整合Python
  • (4)logging(日志模块)
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (搬运以学习)flask 上下文的实现
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)母版页和相对路径
  • *算法训练(leetcode)第四十五天 | 101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104. 建造最大岛屿
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET C# 配置 Options
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .NET连接MongoDB数据库实例教程
  • /proc/stat文件详解(翻译)
  • @ModelAttribute注解使用
  • @Not - Empty-Null-Blank
  • [20150629]简单的加密连接.txt