2017-09-01 39 views
0

初學者的問題,但我怎麼線程?如何穿線功能?

我有這樣的代碼片段:

std::vector<std::thread*> threads[8]; 
for (unsigned short rowIndex = 0; rowIndex < unimportantStuff.rows; ++rowIndex) 
{ 
    for (unsigned short columnIndex = 0; columnIndex < unimportantStuff.columns; ++columnIndex) 
    { 
     myModelInstance = new CModelInstance; 
     myModelInstance->Init(myLoader.CreateTriangle(myFramework.myDevice, { -0.8f + unimportantStuff.offset*columnIndex, -0.8f + unimportantStuff.offset*rowIndex }), { -0.8f + unimportantStuff.offset*columnIndex, -0.8f + unimportantStuff.offset*rowIndex }); 
     myScene.AddModelInstance(myModelInstance); 
    } 
} 

我想線程同時初始化函數和AddModelInstance功能如果可能的話,但是我不知道該怎麼繼續。我如何激活多個線程(在這種情況下最多8個線程)?

我試圖用這樣一個線程:

std::thread t1(myScene.AddModelInstance, myModelInstance); 

,但我得到了以下錯誤:

CScene :: AddModelInstance':非標準語法;使用'&'來創建指向成員的指針

我試着將&同時添加到函數和參數中,但都不起作用。

+3

我敢打賭,你不想要一個向量指向線程的8個向量的數組。如果你想要一個線程矢量,那就是'std :: vector ' – user463035818

+2

爲什麼你有一個init函數?這是一種代碼味道。使用構造函數,它被設計爲初始化一個對象。 – 2017-09-01 14:45:54

+0

謝謝你指出。我不知道,當我看到我的同學代碼時,它已經進入我的代碼。我認爲我的老師提到這是行業的代碼標準,但我明白你的觀點。 –

回答

4

取而代之的是:

std::thread t1(myScene.AddModelInstance, myModelInstance); 

你需要的東西是這樣的:

std::thread t1(&Scene::AddModelInstance, myScene, myModelInstance); 

&Scene::AddModelInstance是一個指向你要撥打的成員函數,這大概需要一個隱含的this參數(myScene )。

+0

這不是「推測」。成員函數有一個隱含的參數,在主體中成爲'this' – Caleth

+0

不幸的是它不起作用。我得到的錯誤:術語不計算爲一個函數帶3個參數。那可能是什麼? –

+0

@Caleth:這是「大概」,因爲成員函數可以是「靜態」,在這種情況下不需要'this'。我想不是在OP的情況下。 –

0

假設mySceneScene類型的嘗試:

std::thread t1(&Scene::AddModelInstance, &myScene, myModelInstance); 
+0

不幸的是它不起作用。我得到的錯誤:術語不計算爲一個函數帶3個參數。那可能是什麼? –

+0

函數AddModelInstance的簽名是什麼? – Sinapse

+0

對不起,我不知道簽名是什麼。該函數返回一個布爾值,並將CModelInstance指針作爲參數。這有幫助嗎?它所做的就是將模型實例推入向量,然後始終返回true。 –

0

乾淨,直觀的方法是使用lambda expressions

std::thread t1([&]() mutable {myScene.AddModelInstance(myModelInstance);}); 

確實會注意到有關引用或值捕捉

作爲一個便箋,請確保您的程序中沒有data races

+0

應用程序現在編譯,但運行時現在有隨機錯誤。我跑了它四次,我得到了錯誤的內存分配錯誤,nullptr錯誤,vectour越界和另一個錯誤的內存分配錯誤。我想有一些方法可以使線程安全嗎? –