You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C++线程中传递引用参数?附测试代码

在C++线程中传递引用参数的正确方式

我完全懂你的困扰——网上随便搜都是C++线程传递普通整数的示例,但涉及引用参数的实现确实容易找不到清晰的说明。其实核心问题在于std::thread的构造逻辑:它默认会拷贝所有传递的参数,如果你直接传引用,线程函数里的引用并不会绑定到你原本的变量上,反而会绑定到临时拷贝的对象上,很容易导致悬空引用这类未定义行为。

下面我给你拆解正确的实现方式,附上完整的测试代码,还会指出你代码里可能的问题:

核心解决方案:用std::ref包装引用参数

要让线程真正接收引用参数,你需要用<functional>头文件里的std::ref()来包装要传递的变量,告诉std::thread我们要传递的是引用而非拷贝。

完整测试代码

#include <iostream>
#include <thread>
#include <functional> // 必须包含这个头文件来使用std::ref

// 传值的函数示例
void add(int a, int b) {
    std::cout << "Add result: " << a + b << std::endl;
}

void sub(int a, int b) {
    std::cout << "Sub result: " << a - b << std::endl;
}

// 接收引用参数的函数:注意参数是int&
void addp(int& num, int val) {
    num += val;
    std::cout << "After addp: num = " << num << std::endl;
}

// 补充实现你代码中未定义的toplamap函数(示例为累加引用变量)
void toplamap(int& sum, int val) {
    sum += val;
    std::cout << "After toplamap: sum = " << sum << std::endl;
}

int main() {
    int x = 10;
    int y = 5;

    // 传递普通参数的线程(正常工作)
    std::thread t_add(add, x, y);
    std::thread t_sub(sub, x, y);

    // 传递引用参数的线程:必须用std::ref包装x
    std::thread t_addp(addp, std::ref(x), y);
    // 调用toplamap时同样需要用std::ref传递引用
    std::thread t_toplamap(toplamap, std::ref(x), y);

    // 必须等待所有线程完成,否则主线程提前退出会导致子线程异常终止
    t_add.join();
    t_sub.join();
    t_addp.join();
    t_toplamap.join();

    // 查看x的最终值,确认引用修改生效
    std::cout << "Final x value in main: " << x << std::endl;

    return 0;
}

关键要点说明

  1. std::ref的作用:它会创建一个引用包装器,让std::thread构造函数识别出我们要传递的是原始变量的引用,而不是创建拷贝。如果不用std::ref,线程函数里的引用会绑定到临时拷贝上,当临时对象销毁后,引用就悬空了,这会导致未定义行为。
  2. 线程生命周期管理:一定要调用join()等待子线程完成,或者用detach()让线程在后台运行(但detach()要谨慎使用,避免主线程退出后子线程还在运行)。
  3. 对象有效性:确保引用指向的对象在子线程运行期间始终存在,比如不要传递局部变量的引用给线程,否则局部变量销毁后子线程的引用就失效了。

你代码里的问题提示

你提到的toplamap未定义,我在代码里补充了一个示例实现,如果你的需求不同,可以根据这个模板修改——核心还是用std::ref来传递引用参数。

内容的提问来源于stack exchange,提问作者Türker Berke Yıldırım

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:58:46