用匿名类调用启动std :: thread

时间:2014-04-17 02:49:01

标签: multithreading c++11 anonymous-class

我很好奇如何使用匿名类调用正确启动std :: thread。

使用下面的代码,如果我的类只有1个成员变量,我调用std :: thread td(someclass(s​​hared_mutex));我收到编译警告警告 C4930:'std :: thread td(someclass)':未调用prototyped函数(是否为变量定义?)

但是,如果我添加第二个成员变量,如下所示并调用它 std :: thread td(someclass(s​​hared_mutex,x)); 我收到错误,错误C2064:term不评估为带0参数的函数。

class someclass
{ 
private:
  std::mutex& shared_mutex;
  int x;

public:
  someclass(std::mutex& init_mutex, int init_x) :
    shared_mutex(init_mutex),
    x(init_x)
  {}
  //...
};

int main()
{
  std::mutex shared_mutex;
  int x = 10;
  std::thread td(someclass(shared_mutex,x));
  td.join();
  return 0;
}

解决这个问题的唯一方法是创建一个     void operator()()     {} 在类中,但这是正确的方法,只是为线程引用有一些启动函数或我在这里错过了一些其他点?我认为构造函数会解析它吗?

2 个答案:

答案 0 :(得分:1)

尝试使用{}语法构造对象,以避免将veximg解析为函数声明。

std::thread td(someclass(shared_mutex,x))

变为

std::thread td{someclass{shared_mutex,x}}

答案 1 :(得分:0)

您似乎希望线程执行someclass的长时间运行的构造函数,然后立即丢弃新构造的someclass。这可以通过向线程构造函数传递一个函数对象来完成:

int main()
{
    std::mutex shared_mutex;
    int x = 10;
    std::thread td([&]{someclass(shared_mutex,x);});
    td.join();
    return 0;
}

警告:构建一个新线程是一项非常昂贵的操作,所以如果你有能力重新使用现有线程,你应该避免随便产生新线程,除非你只是很少创建新线程。