2016-10-22 7 views
0

ちょっと:)それは実際には実用的な例ではありません。ちょうどいくつかのことをテストすることです。複数の無限スレッド

スレッドは、ランダムにデータを作成し、このデータを別の受信者オブジェクトに送信する独立した入力オブジェクトを表すものとします。

私の問題は、私は彼らが無限の時間のためのデータを作成したいということです。しかし、最初のスレッドを開始すると、whileループの原因が突き当たります。

それはどのように複数の無限のスレッドを開始することは可能でしょうか?

クラスA:

#pragma once 

#include <iostream> 
#include <thread> 

class A 
{ 

public: 

    A()  : m_ID(-1) {} 
    A(int _ID) : m_ID(_ID) {} 
    ~A()     {} 

public: 

    void DoWork() 
    { 
     std::thread T(&A::Work, this); 

     T.join(); 
    } 

private: 

    void Work() 
    { 
     while (true) 
     { 
      // do stuff 
      std::cout << m_ID << "\n"; 
     } 
    } 

private: 

    int m_ID; 

}; 

main.cppに:

#include "A.h" 

static const unsigned int s_NumberOfObjects = 5; 

void main() 
{ 
    A As[s_NumberOfObjects]; 

    for (size_t i = 0; i < s_NumberOfObjects; i++) 
    { 
     As[i] = A(i); 
    } 


    for (size_t i = 0; i < s_NumberOfObjects; i++) 
    { 
     As[i].DoWork(); 
    } 
} 
+0

'A :: DoWork()'から 'T :: join();'行を削除します。 – Leon

+0

これでエラーが表示されます:R6010 - abort()が呼び出されました – Chris

+1

代わりに 'T.detach()'を入れてください。 – Leon

答えて

1

スレッドメンバ変数行い、detachを用いAデストラクタに

class A{ 
    /* ... */ 

public: 
    ~A() { m_Worker.join(); } 

/*...*/ 
void DoWork() 
{ 
    m_Worker = std::thread(&A::Work, this); 
} 

private: 
    int m_ID; 
    std::thread m_Worker; 

}; 

join関数を移動していますあなたがスレッドのためのすべてのトラックを緩めると非常に落胆し、あなたはwaがありませんyを指定すると、アプリケーションが終了するときれいにシャットダウンするよう指示されます。

+0

は私にとっては機能しません。 VisualStudioは、関数operator = for std :: threadが削除された関数であることを教えてくれます – Chris

+0

あなたはどのバージョンのVisual Studioを使っていますか? –

+0

Visual Studio Professional 2013 – Chris

関連する問題