2016-08-05 5 views
0

でconfilicts避けてください:各反復においては、私は次のようにループを作成する必要があり、順次スレッド

while (!end) { 

    // some modifications to myPar 

    boost::thread t(&myClass::myFun, this, myPar); 

    // other operations 
} 

を、私はスレッドが前の反復で呼び出す1が終了したときにのみ起動します。しかし、私は "他の操作"がそれを待つことを望んでいません。 これを行う方法はありますか?

答えて

0

私はブースト::スレッドで遊んでいませんでしたが、これに似た何かが、あなたがこの

class Worker 
{ 

public: 
    void addParams(const SomeParams &params) 
    { 
     paramsQueue.push(params); 
    } 

    void start() 
    { 
     auto loop = [this]() 
     { 
      while(!interrupted) 
      { 
       //BLOCK HERE if queue is empty 

       auto params = paramsQueue.pop(); 

       //do something with params 
      } 
     }; 

     thread = {loop}; 
    } 

    void interrupt() 
    { 
     interrupted = true; 
    } 

private: 
    boost::thread thead; 
    std::queue<SomeParams> paramsQueue; 
    bool interrupted = false; 
}; 


... 

Worker worker; 

worker.start(); 

while (!end) { 

    // some modifications to myPar 

    worker.addParams(params); 

    // other operations 
} 

ような何かを行うことができます

boost::thread t; 
while (!end) { 

    // some modifications to myPar 
    if(t.joinable()) 
      t.join(); 

    t = {&myClass::myFun, this, myPar}; 

    // other operations 
} 

EDIT に関するコメントを動作しますが、実装するために覚えておく必要がありますあなたが空のキューを読み込もうとすればあなたはUBを持つでしょうから。また、キューからのプッシュとポップはスレッドセーフでなければなりません。

+0

"これ以外の操作"が実行されるのが遅れませんか? – charles

+0

他の操作ですか? @charles、あなたは待たずに実行できる操作だけを並列に実行する必要があります – Netwave

+1

myFunを一度に並列に実行する場合は、paramsのキューを持つクラスのようなものを作成します。キューからのパラメータ付き – stryku

関連する問題