线程创建失败时线程参数的状态——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
相关产品推荐
相关产品推荐

