封装的boost thread_group。有关ID和同步的问题

时间:2009-09-24 15:09:29

标签: c++ multithreading boost threadgroup

我正在使用一个封装了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不同,或者对每个人都相同吗?

提前致谢!

2 个答案:

答案 0 :(得分:1)

是的,即使您使用线程创建帮助程序作为提升,也必须保护共享数据访问。

最后,他们都将同时执行相同的代码,并且库无法对您拥有的变量进行保护并且您可以进行管理。

如果this-&gt; _id打印当前线程ID然后是,则在不同线程访问它时将打印不同的值。

答案 1 :(得分:0)

我不知道你对这个thread_group做了什么,所以这可能适用也可能不适用。

是的,所有主题都有唯一的ID。

是的,您需要保护您的共享状态,您可以通过同步或通过复制或通过消息传递来“避免”共享状态来保护您的共享状态。

这里的相关模式是'演员'模式。

基本上不是在构造函数中创建线程,而是考虑:

a)有一个派生自boost :: thread的类,并在那里存储特定于线程的成员。然后,您可以访问线程中不属于该组的全局成员变量。

e.g。

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中共享哪个状态(它应该是同步的还是只读的)以及哪个状态是您的actor(或线程)的本地状态以及它是如何可访问的。

注意,我个人不愿意使用TLS,因为我喜欢对对象和线程的生命周期进行一些控制和保证,而且当我不使用它时,我发现这更容易; YMMV和它的一些用途......