std::vector的emplace_back第二个参数传入类指针this的含义是什么?
std::vector::emplace_back传入类this指针的作用与用法解释
代码行为拆解
你给出的代码是线程池的标准构造逻辑,pool.emplace_back(&TaskExecutor::schedual, this);可以拆分为两层逻辑理解:
第一层:emplace_back的作用
std::vector<std::thread>::emplace_back会在容器的尾部就地构造std::thread对象,无需生成临时对象再做移动/拷贝,比你注释里写的push_back(std::thread{...})写法效率更高,两者功能完全等价。
第二层:std::thread构造传入this的作用
C++的非静态类成员函数存在隐含的this入参:调用任何非静态成员函数时,都需要绑定一个对应的类实例地址作为函数的第一个隐式参数,不能直接把非静态成员函数作为独立的可调用对象执行。std::thread的构造函数要求:
- 第一个参数是要在线程中执行的可调用对象
- 后续所有参数都会被传递给这个可调用对象作为入参
当可调用对象是&TaskExecutor::schedual(TaskExecutor类的非静态成员函数指针)时,第一个要传递的参数就必须是该成员函数所属的类实例指针,这里传入的this就是指向当前正在构造的TaskExecutor实例本身,作用就是告诉新启动的线程:要运行的schedual函数属于当前这个线程池实例。
额外注意事项
这种实现要求
TaskExecutor实例的生命周期必须长于内部所有工作线程的生命周期,一旦线程池实例先于线程析构,运行中的线程访问悬空的this指针会触发未定义行为,这是线程池实现的通用约束。
内容的提问来源于stack exchange,提问作者jojo_Aero_smith_the_dummy
相关产品推荐
相关产品推荐

