如果对象的生命周期只是绑定到 的范围main
,那么这很容易 - 只需确保在销毁对象之前已停止并加入所有线程。这可以通过使用范围内的智能指针管理对象来更好地执行,main
或者更简单地说,通过在 内赋予对象自动生命周期main
:
void thread_func(Cdefine *);
int main()
{
Cdefine thing;
thing.Init();
std::thread thread1(thread_func, &thing);
std::thread thread2(thread_func, &thing);
// do stuff
thread1.join();
thread2.join();
// Now it's safe to destroy the object
}
在更复杂的情况下,您不能简单地将对象绑定到比线程更广泛的范围,您可以考虑使用std::shared_ptr
(std::tr1::shared_ptr
或者boost::shared_ptr
如果您坚持使用 2011 年之前的语言)来管理它。例如:
void thread_func(std::shared_ptr<Cdefine> p);
void spawn_threads()
{
std::shared_ptr<Cdefine> p = std::make_shared<Cdefine>();
p->Init();
std::thread thread1(thread_func, p);
std::thread thread2(thread_func, p);
thread1.detach();
thread2.detach();
// The threads can carry on doing their thing, and it's safe to
// drop our shared pointer. The object will be deleted when the
// last thread drops its pointer to it.
}
顺便说一句,为什么在Init
构造对象之后需要调用函数?为什么不在构造函数中初始化它,因为那是构造函数的用途?