向C++线程函数传递参数时,类型转换何时执行?
C++线程参数转换时机的问题解析
核心结论
char*到std::string的转换是在新线程被操作系统调度执行时,才在新线程的上下文中完成的,而非主线程构造std::thread对象的阶段。
具体过程拆解
- 构造
std::thread t(f,3,buffer)时,线程库仅会把buffer对应的char指针复制到线程内部的存储区域,不会立即执行char到std::string的转换。 - 只有当操作系统调度该新线程开始运行后,线程库才会在新线程的执行栈上,用之前复制的char*指针构造std::string参数,随后才会调用目标函数
f。
为什么会触发未定义行为
主线程的oops函数可能在新线程完成std::string构造前就执行完毕,此时局部数组buffer会被销毁,新线程拿着已失效的char*指针去构造std::string,直接导致未定义行为。
修复方案
- 提前在主线程中完成转换:将代码改为
std::thread t(f,3,std::string(buffer));,这样复制到线程存储的是已构造好的std::string对象,不再依赖局部变量buffer的生命周期。
内容的提问来源于stack exchange,提问作者SICSU
相关产品推荐
相关产品推荐

