0

入力引数とスレッド グループ内のスレッドからの戻り値の両方を処理する関数を作成しようとしています。

私の例のクラス:

  // includes...
class MyClass(int id)
  {
  thread_id = id;
  i = id* 5; 
  b = false;
 }

void resetCounter(int j){
  i = j * 5;
 }
int getId(){
 return id;
}
bool getBool(){
  return b;
 }

void DoWork(){
  while( i > 0 ){
     boost::this_thread::sleep(boost::posix_time::seconds(i));
      i--;
  }
  b = true;  // DoWork will in the real code be able to return false!
  }
  private:
  bool b;
  int i;
  int thread_id
 };

  boost::threadgroup threads;

コード例:

  bool exist = false;
  for(int i=0;i<4;i++){
  // first check if thread id exist (possible)? 
  // If so don´t create a new thread but reset the counter!
  if(exist){
   // in current thread call reset "i" (w.resetCounter(i))
   }else{
    MyClass m(i);
    boost::function<void()> thread_func = boost::bind(&MyClass::DoWork, &m);
    threads.create_thread(thread_func);
   }
 }

スレッドを反復処理して、DoWork が true を返したかどうかを確認できるようにしたいと考えています。

これを実装するにはどうすればよいですか?

4

1 に答える 1

0

まず第一にthread_group、スレッド オブジェクトを反復処理することはできません。したがって、これが必要な場合は、スレッド オブジェクトを他のコンテナーに格納することを検討してください。

また、1 つのスレッドが終了するまで移植可能に待機することはできませんが、Windows 固有の API を使用することを気にしない場合は、WaitForMultipleObjects.

ただし、このようなトリックを避けるために、アプリケーションを再設計することをお勧めします。

于 2012-09-09T09:58:22.120 に答える