2.1.1 启动线程

  使用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();  
));

 

posted on 2021-05-07 17:56  天官赐福  阅读(73)  评论(0)    收藏  举报