通过 (Args&&...) 构造 std::thread

问题描述 投票:0回答:1

SO是一场狗屎秀。感谢您的搭车。

c++ multithreading c++11
1个回答
3
投票

example1
example2
之间没有真正的区别。
thread( Function&& f, Args&&... args );
构造函数的 cppreference 描述略有偏差 - 正如标准所称,
DECAY_COPY
是针对函子
f
和参数
args...
执行的。

换句话说,创建的线程有自己的函子副本(其中包括 lambda 捕获的任何内容)以及您传递的任何参数;这使得您更难编写数据竞争或导致悬空指针和引用的未定义行为。毕竟,lambda 表达式创建了一个临时函子,该函子在下一个

;
处被销毁。如果
thread
的构造函数没有复制,你就会陷入大麻烦。

无论您选择在 lambda 中传递所有内容,还是使用类似于

bind
的方式单独传递参数,主要是风格问题。有时,使用类似
bind
的版本可能会很困难,例如,如果您要调用的函数已重载或者是函数模板。其他时候,您可能无法捕获 lambda 中的某些内容,尤其是 C++14 之前的版本。

© www.soinside.com 2019 - 2024. All rights reserved.