我正在使用一个封装了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不同,或者对每个人都相同吗?
提前致谢!
答案 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和它的一些用途......