调用带有带参数的类成员函数的std::thread构造函数
Calling a std::thread constructor with a class member function that takes parameters
我知道存在这个问题和这个问题。这两种方法我都试过了,但都没能解决我的问题。我能够运行不带参数的类成员函数的示例,但无法推断出如果成员函数有参数,线程的构造函数会是什么样子。
我有一个类a, a有一个成员函数f,它有两个参数p1和p2。我已经实例化了类a的对象a。我想在线程中调用函数f。
From cppreference.com:
template< class Function, class... Args >
explicit thread( Function&& f, Args&&... args );
是我必须编写构造函数的方式。
我破译上述定义有困难。如何调用定义为
的a.f(p1,p2) void A::f(int p1, int p2)
直接传递参数:
std::thread t(&A::f, &bar, p1, p2);
t.join();
注意:注意我们正在传递bar
对象的地址,否则线程构造函数会复制你的对象。通过这样做,你必须保证你的对象比你的线程更长寿。注意,其他参数也是如此。在参数的情况下,您可以简单地使用std::ref
。
一般来说,正如我在另一篇文章中提到的,std::thread
构造函数是根据INVOKE
定义(§20.8.2.1)定义的:
定义INVOKE (f, t1, t2,…), tN)如下:
- (t1。* f) (t2,…,当f是指向类T的成员函数的指针,t1是T类型的对象或对的对象的引用时,则为tN)类型T或对从T派生的类型的对象的引用;
- ((* t1)。* f) (t2,…当f是指向类T的成员函数的指针,且t1不是前面描述的类型之一时,则为tN)项;
- t1。当N == 1,且f是指向类T的成员数据的指针,且t1是类型T或
的对象时,*f对T类型对象的引用或对
类型对象的引用- (* t1)。当N == 1,且f是指向类T成员数据的指针,且t1不是上一项所述的类型时,*f;
- f(t1, t2,…)
相关文章:
- 在std::thread中,joinable()然后join()线程安全吗
- 分离一个静态常量 std::thread?
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- 如何从 std::thread 返回值
- 将 std::thread by 值推送到列表中
- 转发变量参数列表以模拟 std::thread
- 对 'std::thread::_M_start_thread CMake 的未定义引用进行基准测试
- std::thread 增加 DLL 引用计数,从而防止卸载 DLL
- 如何防止 std::thread 在 QT 中冻结 GUI?
- 对带有唯一指针的 std::thread 使用类成员函数时出现编译错误
- 为什么参数在构造 std::thread 时移动两次
- std::thread::_Invoker 使用线程编程时出错
- 在线程 A 中创建一个 std::thread 对象,在线程 B 中连接
- 为什么编译器抱怨 std::thread 参数在转换为右值后必须是可调用的?
- ZeroMQ 在使用 std::thread 创建工作线程时崩溃
- 在没有复制构造函数的对象的成员函数中启动 std::thread
- CLang:在 std::thread 中运行函数会导致结构创建BAD_ACCESS
- 调用以CWinThread为基的类运算符()的std::thread失败
- 如何通过std::thread生成多个线程
- std::future::get()或std::future::wait()是std::thread::join()的替