【问题标题】:Compiler errors at creating a thread [duplicate]创建线程时的编译器错误[重复]
【发布时间】:2013-09-03 15:26:26
【问题描述】:

每次调用 ObjParser::loadData() 时,我都会尝试启动一个新线程,就像他们在 this 示例中所做的那样。

所以我写了这段代码。

#include <thread>   
void ObjParser::loadData()
{
   thread loadingThread(_loadData);
   loadingThread.detach();
}

void ObjParser::_loadData()
{
   //some code
}

但是当我尝试编译它时,我得到了这个错误:

error C3867: 'ObjParser::_loadData': function call missing argument list; use '&ObjParser::_loadData' to create a pointer to member

所以我创建了一个指向成员函数的指针:

#include <thread>   
void ObjParser::loadData()
{
   thread loadingThread(&ObjParser::_loadData);
   loadingThread.detach();
}

void ObjParser::_loadData()
{
   //some code
}

然后编译器抱怨:

error C2064: term does not evaluate to a function taking 0 arguments 

我不知道是什么导致了这个问题,请你给我一个提示如何解决这个问题。

【问题讨论】:

  • 您需要添加一个实例参数,在该参数上将调用成员函数。见这里stackoverflow.com/a/10673671/893693。注意:如果你不复制它,请注意对象的生命周期。
  • 您确定要在此处创建话题吗?一个分离的线程? std::async 是否更适合您的目的?
  • 你确定线程分离是个好主意吗?
  • 感谢您的回答。为什么使用 detach() 不是一个好主意?如果我不使用 detach(),我由线程对象启动的操作将被停止,不是吗?

标签: c++ multithreading c++11 stl


【解决方案1】:

_loadData 似乎是一个非静态成员,因此您需要在一个对象上调用它 - 大概是调用 loadData 的同一个对象:

thread loadingThread(&ObjParser::_loadData, this);

或使用 lambda

thread loadingThread([this]{_loadData();});

或者,我可能会放弃额外的功能而只使用 lambda:

thread loadingThread([this]{  // or [] if you don't need to access class members
    // some code
});

【讨论】:

    【解决方案2】:

    C++ 11 线程的工作方式与 Boost 的线程非常相似。他们期望一个不带参数的函数或函数对象,因此如果您的函数是您使用的类的成员函数,您需要将函数指针绑定到对象的实例和所需的任何参数。看看 std::bind std::mem_fn 之类的......

    【讨论】:

    • 你是对的,他们像 boost 线程一样工作,但是他们期望一个 0 参数函数或者你需要使用绑定是错误的,boost::thread t(&amp;SomeClass::memfunc, this, arg1, arg2) 已经被支持很多很多年了,并且也适用于std::thread
    • @Johnathan Wakely:好的,我们都通过两种不同的方法达到相同类型的构造,我所说的方法在调用之前是显式的,你的方法利用初始化列表首先构造 std ::function std::thread 期望的兼容对象。
    猜你喜欢
    • 2021-12-07
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-04
    • 2018-01-15
    相关资源
    最近更新 更多