我很好奇如何使用匿名类调用正确启动std :: thread。
使用下面的代码,如果我的类只有1个成员变量,我调用std :: thread td(someclass(shared_mutex));我收到编译警告警告 C4930:'std :: thread td(someclass)':未调用prototyped函数(是否为变量定义?)
但是,如果我添加第二个成员变量,如下所示并调用它 std :: thread td(someclass(shared_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()() {} 在类中,但这是正确的方法,只是为线程引用有一些启动函数或我在这里错过了一些其他点?我认为构造函数会解析它吗?
答案 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;
}
警告:构建一个新线程是一项非常昂贵的操作,所以如果你有能力重新使用现有线程,你应该避免随便产生新线程,除非你只是很少创建新线程。