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

线程创建失败时线程参数的状态——jthread移动字符串场景分析

线程创建失败时参数的状态问题

当线程创建失败时,线程的参数会处于什么状态?假设我通过如下代码创建jthread线程:

jthread thr( []( string &&str ) {}, move( str ) );

若线程创建失败,原字符串是否能保证保留原有内容?

结论

原字符串无法保证保留原有内容。

原因

在std::jthread的构造流程中,会先对传递的参数执行完美转发操作:这里的std::move(str)会把原字符串的内容移动到线程内部的临时存储对象中,这个移动操作是在尝试创建线程之前就完成的。

如果后续线程创建失败(比如系统资源不足),jthread的构造函数只会销毁内部的临时存储对象,但已经被移动的原字符串str不会被恢复。此时str处于合法但未定义的状态——它可能是空字符串,也可能残留部分内容,但C++标准不对其原有内容的留存做任何保证。

简单来说:只要你用std::move传递参数,不管线程最终是否创建成功,原对象的内容都已经被移走,无法保证留存。

补充建议

如果希望原字符串不受线程创建结果的影响,可以先拷贝一份字符串,再传递拷贝后的对象:

string temp = str;
jthread thr( []( string &&str ) {}, move( temp ) );

内容的提问来源于stack exchange,提问作者Edison von Myosotis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 13:58:13