使用C++线程库来开始一个线程,需要构造一个std::thread对象。
void do_some_work(); std::thread my_thread(do_some_work);
std::thread的构造函数参数可接受任何可调用对象,所以,可以将一个带有调用运算符的类的实例传递给std::thread的构造函数。在这种情况下,函数对象f被复制到新线程的存储器中,并从那里调用。
class background_task() { public: void operator()() const { do_something(); do_something_else(); } }; background_task f; std::thread my_thread(f);
但是,如果你传递一个临时的且未命名的变量,那么其语法可能与函数声明一样。在这种情况下,编译器会将其解释为函数声明,而非对象定义。
// 函数声明:返回类型为std::thread;函数名为my_thread;参数类型是函数指针 std::thread my_thread(background_task ());
为了避免这种情况,可以使用以下三种方式。
// 额外的括号避免其解释为函数声明 std::thread my_thread((background_task ()));
// 使用新的统一初始化语法 std::thread my_thread{background_task ()};
// 使用lambda表达式 std::thread my_thread([]( do_something(); do_something_else(); ));
原文:https://www.cnblogs.com/tgcf/p/14742066.html