无法使用线程构造函数

时间:2015-06-11 21:01:26

标签: c++ multithreading

我一直在努力学习如何使用多线程,但我无法正确创建线程对象。我有一个名为task的函数的对象,但是当我添加函数和参数时,它表示构造函数不接受它。顺便说一句,我使用visual studio作为我的IDE。

这是我的主要文件:

#include <iostream>
#include <thread>
#include "Task.h"
using namespace std;
int main(int argc, char** argv)
{
    Task t;
    thread t1(t.task, 1);
    t1.join;
    return 0;
}

任务对象的类:

#include "Task.h"
#include <iostream>
using namespace std;
Task::Task()
{
}
Task::~Task()
{
}
void Task::task(int x) {
    cout << "In Thread " << x << '\n';
}

错误:Error: no instance of constructor"std::thread::thread" matches the argument list argument types are: (<error-type>, int)

更新: 所以我放入thread t1(&Task::task, &t, 1);并摆脱了t1.join,但现在我遇到了一个新问题。程序编译并运行,但是当它运行时,它显示&#34;在线程1&#34;在控制台中,另一个窗口显示:

Debug Error!

abort() has been called

(Press retry to debug the application)

1 个答案:

答案 0 :(得分:5)

您遇到的问题是Task::task是成员函数。成员函数有一个隐藏参数,用作this指针。要完成这项工作,您应该传递要用作this指针的类的实例。所以像这样初始化你的线程

thread t1(&Task::task, &t, 1)

您的示例中的另一个问题是join未被调用。 t.join实际上并未拨打join,您必须这样称呼它:t.join()。如果std::thread的析构函数执行且join未被调用,则析构函数将调用std::terminate

有关std::thread构造函数的详细信息,请参阅here,针对其析构函数,请参阅here