0

thread_groupをカプセル化するクラスを使用していますが、いくつか質問があります

class MyGroup{

private:
     boost::this_thread::id _id;
     boost::thread::thread_group group;
     int abc;
     //other attributes
public:

     void foo();


};

クラスコンストラクターで、N個のスレッドを起動します

for (size_t i=0;i<N;i++){
      group.add(new boost::thread(boost::bind(&foo,this)));
}


void foo(){

   _id = boost::this_thread::get_id();
   //more code.
   abc++ //needs to be sync?
}

それで、ここに私の質問があります。

クラス属性を同期する必要がありますか?

すべてのスレッドは異なるIDを取得しますか?たとえば、私が持っている場合

void bar(){
  this->id_;
}

これにより、スレッドごとに異なるIDが生成されますか、それともすべてのスレッドで同じになりますか?

前もって感謝します !

4

2 に答える 2

1

はい、スレッド作成ヘルパーをブーストとして使用する場合でも、共有データ アクセスを保護する必要があります。

最終的に、それらはすべて同じコードを同時に実行することになり、ライブラリが所有および管理する変数を保護するためにできることは何もありません。

this->_id が現在のスレッド ID を出力する場合は、はい。異なるスレッドがアクセスしている間、異なる値を出力します。

于 2009-09-24T15:22:32.437 に答える
0

この thread_group で何をしているのかわかりませんので、これが当てはまる場合と当てはまらない場合があります。

はい、すべてのスレッドに固有の ID があります。

はい、共有状態を保護する必要があります。これは、同期を使用するか、共有状態をコピーして「回避」するか、メッセージパッシングを使用して行うことができます。

ここで関連するパターンは「アクター」パターンです。

基本的に、コンストラクターでスレッドを作成するだけでなく、次のいずれかを検討してください。

a) boost::thread から派生したクラスを持ち、そこにスレッド固有のメンバーを格納します。その後、グループに対してグローバルではないスレッド内のメンバー変数にアクセスできます。

例えば

class MyThreadClass : public boost::thread
{
   private:
   int thread_local_int;
   ...
}

b) boost::thread をメンバー変数として含むクラスを持つ

class MyThreadClass : public boost::thread
{
   private:
      int thread_local_int;
      boost::thread t;
   public:
      boost::thread& GetThread()
      {
          return t;
      }
   ...
}

これらのいずれかのコレクションを MyGroup クラスに保存し、thread_group::add_thread を使用してスレッドを thread_group に入れます。

どの状態が thread_group で共有されているか (同期または読み取り専用である必要があります)、どの状態がアクター (またはスレッド) に対してローカルであり、どのようにアクセスできるかについて、非常に慎重に検討できるようになりました。

オブジェクトとスレッドの有効期間をある程度制御して保証するのが好きで、TLSを使用しないと簡単になるため、TLSの使用に個人的に抵抗があることに注意してください。YMMVといくつかの用途に最適...

于 2009-09-25T04:27:22.353 に答える