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

Multithreading 使用匿名类调用启动std::thread,multithreading,c++11,anonymous-class,Multithreading,C++11,Anonymous Class,我很好奇如何使用匿名类调用正确地启动std::thread 使用下面的代码,如果我的类只有一个成员变量,我调用std::thread td(someclass(shared_mutex));我得到一个编译器警告警告 C4930:'std::thread td(someclass)':未调用原型函数(是否打算使用变量定义?) 但是,如果我添加第二个成员变量,如下所示,并使用 std::线程td(someclass(共享互斥体,x)); 我收到一个错误,错误为C2064:term的计算结果不是一个包

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

使用下面的代码,如果我的类只有一个成员变量,我调用std::thread td(someclass(shared_mutex));我得到一个编译器警告警告 C4930:'std::thread td(someclass)':未调用原型函数(是否打算使用变量定义?)

但是,如果我添加第二个成员变量,如下所示,并使用 std::线程td(someclass(共享互斥体,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运算符()() {}
在类中,但这是正确的方法,只是为了线程引用有某种启动函数,还是我在这里遗漏了其他一些要点?我认为构造函数应该是这个问题的解析器?

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

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

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

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

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

请注意:构建新线程是一项非常昂贵的操作,因此如果您能够重用现有线程,则应避免随意生成新线程,除非您只打算很少创建新线程。

您希望线程做什么?回答完这个问题后,创建一个函数对象来完成这个任务,并在构建时将其传递给线程。你的
someclass
实际上什么都不做,所以我不太明白你想要什么行为。在c++11(给定标记)中,你可以使用lambda表达式作为参数启动线程。你不会有比这更匿名的东西了。@Mankarse
someclass
实际上是一个服务器类,它将调用其构造函数中的另一个成员函数,以尝试获得一个async\u accept调用。我只是想省略示例中的许多代码。但是,即使从构造函数中调用成员函数也不够,除非我有操作符()(),我可以将accept()成员函数调用移到其中,而不是在线程中调用类时使用的构造函数。@oakad你是指
std::thread td([&]{someclass)的意思吗(shared_players_mutex,x);}
?在没有操作符()的情况下尝试了一下,效果很好。好主意!谢谢你的建议!@Pita which对你有用。但是如果你没有实际使用捕获,那么就不要捕获任何东西(以避免将来难以检测的崩溃):
[{someclass(…)}