2016-05-03 30 views
-2

スレッドの配列を持っていて、forループにすべてのスレッドを作成する必要があります。スレッド関数に複数の引数を取るC++ 11

パラメータの1つがstd::move(promise_var)で、もう1つが構造体であるという問題があります。私はそれがコンパイルコンパイルしようとする私にエラー与える:だから、

error: no matching function for call to ‘ std::thread::thread(void (&)(Function), Structure [nNumThreads], std::remove_reference<std::promise<const char*>&>::type)

を、ここではコードの簡易版は、私が追加できるように、(コメントに置かない...

func(struct Structure, std::promise<const char *> && v_Promise){ 
//doing work 
} 

main(){ 
std::thread a_Threads[5]; 

for(int8_t i = 0; i < 5; i++){ 
    a_Threads[i] = std::threads(func, Structure, std::move(v_promise[i])); 
} 
} 
+0

あなたが望むことができるかどうかはわかりませんが、とにかく欲しいとは思わない。ループでは、同じオブジェクトを各スレッドに移動しています。最初の反復の後、 'v_promise'は、その内容がスレッドに移動されたので、もはや使用されるべきではありません。 – NathanOliver

+1

'func'が' std :: promise'へのrvalue参照を取る場合、それはおそらく 'v_promise'から' 'v_promise''から移動し、' v_promise'を未指定、おそらくは使えない状態にしておくことを意味します。その場合、どのスレッドが同じオブジェクトをどのように使用できますか? 5つの 'v_promise'を作成するか、左辺の参照を使用する – KABoissonneault

+0

もちろん、複数引数のスレッド関数を使うことができます。しかし、コードには上記の問題があり、とにかく完全ではありません。 – SergeyA

答えて

2

です

#include <iostream> 
#include <thread> 
#include <future> 

using namespace std; 

struct Structure{ 
int el1; 
int el2; 
}; 

void func(struct Structure, std::promise<const char *> && v_Promise){ 
    cout<<"Hello"<<endl; 
    //doing work 

} 

int main(){ 
    std::thread a_Threads[5]; 
    Structure my_struct; 
    std::promise<const char*> v_promise; 

    for(int8_t i = 0; i < 5; i++){ 

     a_Threads[i] = std::thread(func, my_struct, std::move(v_promise)); 

    } 
} 

してください相互参照本に対して:それはコンパイルし、私は次のコードはコンパイルされることを確認することができますし、コマンドg++ test.cpp -std=c++11 -pthreadと罰金実行されるようにコードが適切に)私はあなたが提出したコードを完了しましたあなたが省略した可能性のあるタイプミスや情報。

+0

このコードはあなたのマシンで正常に動作しましたか? –

+0

うん、clang ++(3.8)とg ++(4.9)の両方を使って、helloを数回出力します。 – nikaza

+0

funcがvoidとして宣言されていますか? – nikaza

関連する問題