引用:
作者: Elminster 你这个设计恐怕走偏了,类似这样的问题从本质上来说是没法避免的。比如说某个 Active 的派生类这么实现: 代码: class VectorPrinter : public Active< string >
{
private:
vector<string> _v;
VectorPrinter(const vector<string>& v) { copy(v.begin(), v.end(), back_inserter(_v)); }
virtual void activity(void)
{
for (vector<string>::iterator i=_v.begin(); i!=_v.end(); ++i) {
cout << *i << endl;
_sleep(1000);
}
}
}; 看起来没太大问题吧?但如果你构造了一个 VectorPrinter 的对象并调用了它的 activate 函数,那么在对应的线程结束之前,你绝对不能析构这个 VectorPrinter 对象,即使你的基类析构函数中调用了 join 也一样:因为运行 VectorPrinter::activity() 函数的线程需要访问 VectorPrinter 中的 _v 成员,但在调用基类析构函数执行 join 之前,派生类的析构函数已经执行了,_v 成员已经被析构了。 |
嗯,我遇到的就是这个问题。就是如何确保在线程结束之前对象不被析构。
最理想的情况是,Active的派生类无论怎么写,实际析构时都会首先执行Active的析构函数,并且不需要用户使用额外的辅助操作。不过现在感觉这不太可能实现了。