线程在 std::thread
对象创建(为线程指定任务)时启动。 最简单的情况下, 任务也会很简单, 通常是无参数无返回(void-returning)的函数 。
使用C++线程库启动线程, 可以归结为构造 std::thread
对象:
void do_some_work();
std::thread my_thread(do_some_work);
为了让编译器识别
std::thread
类, 这个简单的例子也要包含 <thread> 头文件。 如同大多数C++标准库一样, std::thread 可以用可调用( callable) 类型构造, 将带有函数调用符类型的实例传入 std::thread 类中, 替换默认的构造函数。
class background_task
{
public:
void operator()() const
{
do_something();
do_something_else();
}
};
background_task f;
std::thread my_thread(f);
注意: 如果你传递了一个临时变量, 而不是一个命名的变量。 C++编译器会将其解析为函数声明, 而不是类型对象的定义。
std::thread my_thread(background_task());
这里相当与声明了一个名为my_thread
的函数, 这个函数带有一个参数(函数指针指向没有参数并返回background_task
对象的函数), 返回一个 std::thread 对象的函数, 而非启动了一个线程。
使用多组括号①, 或使用新统一的初始化语法②, 可以避免这个问题。
std::thread my_thread((background_task())); // 1
std::thread my_thread{background_task()}; // 2
使用lambda表达式也能避免这个问题。
std::thread my_thread([]{
do_something();
do_something_else();
});
标签:std,do,task,thread,启动,线程,my From: https://www.cnblogs.com/love-9/p/18092984