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,因为我喜欢对对象和线程的生命周期进行一些控制和保证,而且当我不使用它时,我会发现这更容易;YMMV 及其适用于某些用途...

于 2009-09-25T04:27:22.353 回答