ref关键字

std::ref 是什么?

简单的一句话: std::ref 是一个包装器 ,用来告诉 std::thread(以及其他标准库函数如 std::bind):"请传递这个变量的引用(地址) ,而不是它的拷贝(副本)"。

为什么需要它?

std::thread 的构造函数在设计上非常谨慎。为了防止线程运行在分离模式(detach)下访问已经销毁的局部变量,它默认会把所有参数拷贝一份存到线程独立的存储空间里。

这就导致了一个问题:即使你在函数参数里写了 void func(int& n)

std::thread 依然会先拷贝一个副本,然后把这个副本的引用传给函数。

  • 没有 std::ref:你修改的是副本,主线程里的原始变量不会变
  • std::ref:你修改的是原始变量。
代码对比
复制代码
#include <iostream>
#include <thread>
#include <functional> // std::ref 实际上在这里,但 <thread> 通常包含了它

void worker(int& n) {
    n += 10;
}

int main() {
    int n = 0;

    // --- 错误示范 ---
    // std::thread t1(worker, n); 
    // 编译可能会报错,或者虽然编译通过,但 n 仍然是 0。
    // 因为 thread 内部机制拷贝了 n,试图把临时拷贝传给非 const 引用是非法的/无效的。

    // --- 正确示范 ---
    std::thread t2(worker, std::ref(n)); 
    t2.join();

    std::cout << "n is now: " << n << std::endl; // 输出 10
    return 0;
}

底层原理: std::ref(n) 返回一个 std::reference_wrapper<int> 对象。这个对象是可以拷贝的,但它内部保存的是 n 的指针。当它被传递给线程函数时,它会"解包"回原始的引用。

相关推荐
踏着七彩祥云的小丑5 小时前
pytest——Mark标记
开发语言·python·pytest
Dream of maid5 小时前
Python12(网络编程)
开发语言·网络·php
W23035765736 小时前
经典算法:最长上升子序列(LIS)深度解析 C++ 实现
开发语言·c++·算法
.Ashy.6 小时前
2026.4.11 蓝桥杯软件类C/C++ G组山东省赛 小记
c语言·c++·蓝桥杯
Y4090016 小时前
【多线程】线程安全(1)
java·开发语言·jvm
不爱吃炸鸡柳6 小时前
Python入门第一课:零基础认识Python + 环境搭建 + 基础语法精讲
开发语言·python
minji...7 小时前
Linux 线程同步与互斥(三) 生产者消费者模型,基于阻塞队列的生产者消费者模型的代码实现
linux·运维·服务器·开发语言·网络·c++·算法
Dxy12393102167 小时前
Python基于BERT的上下文纠错详解
开发语言·python·bert
wjs20249 小时前
JavaScript 语句
开发语言