2016-07-16 4 views
-3

私はg ++ 4.8を使ってC++ 11プログラムを書いています。私は、単一のスレッドプログラムをマルチスレッドプログラムに変換しようとしています。スレッド化されたバージョンの結合は、コンパイルエラーをスローします。私が間違っているところを教えてください。C++ - スレッドのベクトルに参加する

シングルスレッド(正常に動作します): すべての引数は参照渡しであることに注意してください。

for (const auto& i : vec_clients) 
{ 
    i->startSim(vec_masters, vec_trace1, vec_trace2, vec_trace3); 
} 

マルチスレッド・バージョン:

std::vector<std::thread> vec_thr; 
for (const auto& i : vec_clients) 
{ 
    std::thread t1(&Client::startSim, std::move(i), std::move(vec_trace1), std::move(vec_trace2), std::move(vec_trace3)); 
    vec_thr.push_back(std::move(t1)); 
} 
for (unsigned int i=0; i<vec_thr.size(); ++i) 
{ 
    // if (i.joinable()) 
     vec_thr.at(i).join(); 
} 

変形(簡単な例):そのまま

class Test 
{ 
private: 
public: 
    void testme(const std::string& _str) 
    { 
     std::cout << "Hello "+_str << std::endl; 
    } 
}; 

int main(const int argc, const char **argv) 
{ 
    std::string str = "there"; 
    Test t1; 
    std::vector<std::thread> vec_thr; 
std::thread thr1(&Test::testme, std::move(t1), std::cref(str)); 
    vec_thr.push_back(thr1); 
    return 0; 
} 
+2

あなたが「エラーを投げ終わる」とは何を意味するのですか?ビルドエラーが出ますか?クラッシュ?例外?他に何か?詳しく教えてください。 –

+0

* "エラー" *ちょうど2 downvotesを要した。 – LogicStuff

+0

また、 'std :: thread'を使っても、引き数を引き続き参照渡しすることができます。例えば ​​'' std :: ref'や 'std :: cref'(http://en.cppreference.com/w/cpp/utility/functional/ref)を使ってください。 'std :: thread t1(&Client :: startSim、i、std :: cref(vec_trace1)、std :: cref(vec_trace2)、std :: cref(vec_trace3))' –

答えて

0

誰もがまだ興味を持っている場合には、これが答えです:

class Test 
{ 
private: 
public: 
    void testme(const std::string& _str) 
    { 
     std::cout << "Hello "+_str << std::endl; 
    } 

    void testme2(const std::string& _str) 
    { 
     std::cout << "Hello to "+_str << std::endl; 
    } 
}; 

int main(const int argc, const char **argv) 
{ 
    std::string str = "there"; 
    std::unique_ptr<Test> up1(new Test()); 
    std::unique_ptr<Test> up2(new Test()); 
    std::vector<std::thread> vec_thr; 
    std::thread thr1(&Test::testme, std::move(up1), std::ref(str)); 
    std::thread thr2(&Test::testme2, std::move(up2), std::ref(str)); 
    vec_thr.push_back(std::move(thr1)); 
    vec_thr.push_back(std::move(thr2)); 
    for (unsigned int i=0; i<vec_thr.size(); ++i) 
    { 
     vec_thr.at(i).join(); 
    } 
    return 0; 
} 
3

整数ijoinableメンバ関数(または任意のメンバーの機能を有していませんプリミティブ型)。それはでなければなりません:

for (unsigned int i=0; i<vec_thr.size(); ++i) 
{ 
    if (vec_thr[i].joinable()) 
     vec_thr.at(i).join(); 
} 

スレッドでjoinを使用してください。あなたがdetachingのいずれかではないので、私はここにjoinableのテストを行う特別な理由はありません。

+0

申し訳ありません。それはタイプミスでした。私は結合可能な部分をコメントしていました...削除されたときはわかりません... //〜if(i.joinable()) – AJES123

+0

これは問題ではない場合は、その場合に表示されるエラーメッセージを投稿してください。 – Arunmu

+0

/usr/include/c++/4.8/tuple:135:25:エラー:削除された関数の使用 'std :: unique_ptr <_Tp, _Dp> :: unique_ptr(const std :: unique_ptr <_Tp, _Dp>&)[_Tp = Client; _Dp = STD :: default_delete ]」 :ファイルで_M_head_impl(__ H){}^ /usr/include/c++/4.8/から/usr/include/c++/4.8/memory:81:0、 からインクルードスレッド:40、 from src/DataEngine.h:31、 src/DataEngine.cpp:24: /usr/include/c++/4.8/bits/unique_ptr.h:273:7:エラー:ここに宣言しました unique_ptr (const unique_ptr&)=削除; ^ – AJES123

関連する問題