2015-06-11 76 views
1

我一直在试图学习如何多线程,但我无法正确创建线程对象。我有一个名为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'; 
} 

错误:​​

更新: 所以我把在thread t1(&Task::task, &t, 1);和整肃t1.join,但现在我有一个新问题。程序编译器和运行,但它运行时的权利,则显示“在线程1”在控制台上,而另一个窗口弹出,上面写着:

Debug Error! 

abort() has been called 

(Press retry to debug the application) 
+0

Visual Studio _what_?有很多版本。 –

+1

't1.join'不会编译,你应该总是尝试发布你的真实代码,而不是当场输入。 –

+0

我正在使用视觉工作室专业2015 –

回答

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的析构函数。

+0

我做到了,但现在我有一个新的错误。看看我的问题更新。 –