线程启动

 线程在 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();
});

 

posted @   小熊酱  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示