C++中如何在线程内部使用外部参数?解决Delay参数调用问题
解决线程Lambda内部无法访问Delay参数的问题
你遇到的核心问题是Lambda表达式没有捕获Delay参数,所以线程内部的代码找不到这个变量。这里有两种简单的修复方式,根据你的需求选择:
方法1:值捕获Delay(推荐)
因为Delay是int类型的简单值,直接把它的副本捕获到Lambda里最安全,避免引用可能带来的生命周期问题。修改后的代码如下:
#include <iostream> #include <thread> #include <atomic> #include <windows.h> // 因为用到Sleep,需包含该头文件 void HelloWorldDelay(int Delay) { std::cout << "Hello World"; std::atomic<bool> abort(false); // 将Delay加入捕获列表,使用值捕获 std::thread t([&abort, Delay]() { Sleep(Delay); abort = true; }); t.join(); std::cout << Delay << "Ms "; }
这种方式下,Lambda会创建一个Delay的副本,线程内部使用的是这个副本,完全不用担心原变量的生命周期问题——哪怕函数里的Delay被销毁(不过这里线程是join状态,函数会等待线程结束才继续执行,原变量始终存在),线程里的副本依然有效。
方法2:引用捕获Delay
如果你确实需要使用原变量的引用(比如Delay可能在函数执行过程中被修改,不过当前场景下不太需要),也可以把Delay以引用方式捕获。但要注意:必须保证Delay的生命周期覆盖整个线程的运行时间,这里因为线程是join的,函数会等待线程结束,所以Delay作为函数形参,在线程运行期间肯定是存在的,因此没问题:
#include <iostream> #include <thread> #include <atomic> #include <windows.h> void HelloWorldDelay(int Delay) { std::cout << "Hello World"; std::atomic<bool> abort(false); // 使用引用捕获Delay std::thread t([&abort, &Delay]() { Sleep(Delay); abort = true; }); t.join(); std::cout << Delay << "Ms "; }
不过还是更推荐第一种值捕获的方式,因为它的行为更明确,也不容易出现意外bug(比如如果以后改成detach线程,引用捕获就会导致悬垂引用,程序可能崩溃)。
内容的提问来源于stack exchange,提问作者user7937375
相关产品推荐
相关产品推荐

