SO是一场狗屎秀。感谢您的搭车。
example1
和example2
之间没有真正的区别。 thread( Function&& f, Args&&... args );
构造函数的 cppreference 描述略有偏差 - 正如标准所称,DECAY_COPY
是针对函子 f
和参数 args...
执行的。
换句话说,创建的线程有自己的函子副本(其中包括 lambda 捕获的任何内容)以及您传递的任何参数;这使得您更难编写数据竞争或导致悬空指针和引用的未定义行为。毕竟,lambda 表达式创建了一个临时函子,该函子在下一个
;
处被销毁。如果 thread
的构造函数没有复制,你就会陷入大麻烦。
无论您选择在 lambda 中传递所有内容,还是使用类似于
bind
的方式单独传递参数,主要是风格问题。有时,使用类似 bind
的版本可能会很困难,例如,如果您要调用的函数已重载或者是函数模板。其他时候,您可能无法捕获 lambda 中的某些内容,尤其是 C++14 之前的版本。