0

0

c++中std::thread怎么传递参数_c++线程参数传递方法

下次还敢

下次还敢

发布时间:2025-10-13 19:26:01

|

437人浏览过

|

来源于php中文网

原创

答案:C++中std::thread默认按值传递参数,引用需用std::ref包装,成员函数需传对象指针,注意避免悬空引用。

c++中std::thread怎么传递参数_c++线程参数传递方法

在C++中使用std::thread创建线程时,传递参数是一个常见需求。正确理解参数传递方式可以避免潜在的错误,比如数据竞争或悬空引用。

默认按值传递参数

当你将参数传入std::thread构造函数时,默认是按值拷贝到线程内部的。这意味着即使你传的是变量名,实际在线程函数中接收到的是副本。

例如:

#include 
#include 

void func(int x, std::string str) {
    std::cout << "x = " << x << ", str = " << str << "\n";
}

int main() {
    int a = 42;
    std::string s = "hello";
    std::thread t(func, a, s);  // 按值传递
    t.join();
    return 0;
}

这里as都会被复制一份给线程函数func

立即学习C++免费学习笔记(深入)”;

通过引用传递参数

如果你想在线程中修改外部变量,必须显式使用std::refstd::cref包装引用。

示例:

#include 
#include 

void increment(int& x) {
    ++x;
}

int main() {
    int value = 10;
    std::thread t(increment, std::ref(value));  // 正确传递引用
    t.join();
    std::cout << "value after thread: " << value << "\n";  // 输出 11
    return 0;
}

如果不加std::refincrement接收的将是int的副本,无法修改原变量。

Runwayml(AI painting)
Runwayml(AI painting)

Runway 平台的文本生成图像AI工具

下载

传递类成员函数作为线程函数

调用对象的成员函数时,第一个参数是对象指针或引用,后续才是成员函数的参数。

示例:

struct Worker {
    void run(int id) {
        std::cout << "Worker " << id << " is running\n";
    }
};

Worker w;
std::thread t(&Worker::run, &w, 100);  // &w 是 this 指针,100 是 run 的参数
t.join();

这里&Worker::run是成员函数指针,&w提供对象上下文,100id参数。

注意生命周期问题

确保线程执行期间,所引用的对象仍然有效。特别是使用引用或指针时,避免出现悬空引用。

常见错误:

void bad_example() {
    std::string data = "temporary";
    std::thread t([](const std::string& s) {
        // 可能访问已销毁的 data
        std::cout << s << "\n";
    }, std::ref(data));
    
    t.detach();  // 线程可能还在运行
} // data 在此处析构

这种情况下,如果线程还未执行完,data已被销毁,会导致未定义行为。

基本上就这些。关键是记住:参数默认拷贝,引用需用std::ref,成员函数要传对象,生命周期要管好。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

313

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

522

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

49

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

190

2025.08.29

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

473

2023.08.10

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

54

2025.12.01

java值传递和引用传递有什么区别
java值传递和引用传递有什么区别

java值传递和引用传递的区别:1、基本数据类型的传递;2、对象的传递;3、修改引用指向的情况。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

106

2024.02.23

java值传递和引用传递有什么区别
java值传递和引用传递有什么区别

java值传递和引用传递的区别:1、基本数据类型的传递;2、对象的传递;3、修改引用指向的情况。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

106

2024.02.23

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

177

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
XML教程
XML教程

共142课时 | 5.4万人学习

微信小程序开发之API篇
微信小程序开发之API篇

共15课时 | 1.2万人学习

Laravel---API接口
Laravel---API接口

共7课时 | 0.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号