2017-09-01 10 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); 
    } 
} 

私は、しかし、私は継続する方法を可能わからない場合はInit関数とAddModelInstance機能の両方をスレッドにしたいです。複数のスレッドをアクティブにするにはどうすればよいですか(この場合は最大8個まで)。

私はこのような単一のスレッドで試してみました:

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

しかし、私は次のエラーを取得:

CScene :: AddModelInstance ':非標準の構文を。 '&'を使用してメンバーへのポインタを作成します

&を機能と引数の両方に追加しようとしましたが、どちらも機能しませんでした。

+3

スレッドへのポインタのベクトルの8つのベクトルの配列をしたくないと思います。あなたがスレッドのベクトルを望むなら、それは 'std :: vector ' – user463035818

+2

になるでしょうなぜあなたはinit関数を持っていますか?それはコードのにおいです。コンストラクタを使用して、オブジェクトを初期化するように設計されています。 –

+0

それを指摘してくれてありがとう。私はクラスメイトのコードを見たときに自分のコードに忍び込んでいます。私の教師はそれが業界のコード標準だと言いましたが、私はあなたの意見を見ます。 –

答えて

4

の代わりに、この:あなたはこのような何か必要

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

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

&Scene::AddModelInstanceは、おそらく暗黙のthisパラメータを取り、あなたが呼び出したいメンバ関数へのポインタ、(mySceneです)。タイプSceneであるとmySceneを想定し

+0

"おそらく"ではありません。メンバ関数に暗黙的なパラメータがあり、本体の 'this'になります。 – Caleth

+0

残念ながら、それは動作しません。私はエラーを得る:用語は3つの引数を取る関数に評価されません。それは何でしょうか? –

+0

@Caleth:メンバ関数が 'static'である可能性があるので、おそらく" this "はありません。私はOPのケースではないと思う。 –

0

はこれを試してみてください。

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

残念ながら、それは動作しません。私はエラーを得る:用語は3つの引数を取る関数に評価されません。それは何でしょうか? –

+0

関数 'AddModelInstance'の署名は何ですか? – Sinapse

+0

申し訳ありませんが、私は署名が何であるか分かりません。この関数はboolを返し、CModelInstanceポインタを引数としてとります。これは役に立ちますか?それがしていることは、モデルインスタンスをベクトルにプッシュすると、常にtrueを返します。 –

0

クリーンで直感的な方法は、参照または値

によってキャプチャについて注意取るくださいlambda expressions

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

を使用することです補足として、あなたのプログラムにdata racesがないことを確認してください

+0

アプリケーションはコンパイルされましたが、実行時にランダムなエラーが発生しました。私はそれを4回実行し、不良メモリ割り当てエラー、nullptrエラー、vectourが範囲外になり、別の不良メモリ割り当てエラーが発生しました。私はそれをスレッドセーフにするいくつかの方法があると思いますか? –

関連する問題