线程启动
线程在 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();
});
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端