2015-06-11 2998 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

我做到了,但現在我有一個新的錯誤。看看我的問題更新。 –