我想为 boost thread 编写一个包装器来专门化一个线程模型。我的run()
函数将成为boost::thread
用作聚合线程对象的同一类的成员函数。考虑:
class Thread {
public:
Thread(...) : m_thread(&Thread::run, this) {}
private:
void run() { ... }
boost::thread m_thread;
};
这是潜在的危险,因为this
尚未完全构建。但是,如果我可以保证使用的对象的所有成员run()
都在初始化 boost 线程之前进行了初始化,那么这实际上可以被认为是安全的吗?
我能想到的唯一能保证安全的解决方法是有一个子类来保证一个可以被构造函数使用的对象的完整构造Thread
:
class Thread {
public:
Thread(...) : m_impl(...), m_thread(&ThreadImpl::run, &m_impl) {}
private:
class ThreadImpl {
ThreadImpl(...) { }
void run() { ... }
}
ThreadImpl m_impl;
boost::thread m_thread;
};
有没有一种通用的方法可以做到这一点?对于ThreadImpl
这样一个微不足道的问题,课程似乎有很多开销。