std::thread 中的参数。如何运作?

Posted

技术标签:

【中文标题】std::thread 中的参数。如何运作?【英文标题】:Arguments in std::thread. How works? 【发布时间】:2015-02-25 23:37:00 【问题描述】:

std::thread构造函数使用示例:

#include <thread>
using namespace std;

void a_function()
void a_function2(int a)
void a_function3(int a,int b)
void a_function4(int &a)

class a_class

public:
    void a_function5(int a)
;

int main()

    a_class aux;
    int a = 2;

    thread t(a_function);
    thread t2(a_function2,2);
    thread t3(a_function3,2,3);
    thread t4(a_function4,ref(a));
    thread t5(&a_class::a_function5,&aux,2);

    t.join();
    t2.join();
    t3.join();
    t4.join();
    t5.join();

构造函数如何知道参数的数量?构造函数如何调用一种未知类型的函数?我怎么能实现这样的东西?例如,std::thread 的一个包装器

class wrapper_thread

   thread t;

   public:

         wrapper_thread() //what arguments here?
         : t() //What arguments here?
         

【问题讨论】:

构造函数使用可变参数模板生成等效于调用threadfunc(args)的代码。如果你给它提供导致重载解析失败的参数,你会得到一个编译器错误。 【参考方案1】:

您正在寻找的是parameter pack 运算符。使用它可以编写一个接受可变数量参数的函数。它可以使用这些参数做一些事情,例如将它们转发给另一个函数。

请记住,由于模板是在编译时实例化的,因此在调用站点必须知道参数的数量及其类型。

实现包装线程类的构造函数的简单方法可能是:

template <typename ... Args> // this ctor has variadic template arguments
wrapper_thread(Args& ... args) // pack references to arguments into 'args' 
     : t(args...) //unpack arguments, pass them as parameters to the ctor of std::thread

一旦您了解了这一点,您就可以查看std::forward() 以进行完美转发。 Andrei Alexandrescu 就可变参数模板进行了精彩的演讲。你可以在这里找到它:http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/Variadic-Templates-are-Funadic

【讨论】:

以上是关于std::thread 中的参数。如何运作?的主要内容,如果未能解决你的问题,请参考以下文章

社交引擎中的注册流程如何运作?调用代码的方式/内容和时间

交易(技术上)如何运作?

theme.spacing() 是如何运作的?

什么是生产运作中的律特法则?

像 Virus Total 这样的网站是如何运作的? [关闭]

Gas 机制是如何运作的