在对象构造函数中初始化boost线程
Initialize boost thread in object constructor?
我想为boost线程编写一个包装器来专门化线程模型。我的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
类似乎有很多开销。
声明成员的顺序(但不是初始化列表中的顺序,因此要小心)是构造的顺序。只要构造了所有成员就足以建立一致的状态,就可以声明线程成员的持续时间。
然而,如果你不想依赖它,你可以像这样在构造函数的末尾启动你的线程:// Constructor
MyThread() {
// Initialize everything else...
boost::thread t(boost::bind(&MyThread::run, this));
m_thread.swap(t);
}
关于使用this
指针的安全性,标准在12.6.2中说:
注意:因为mem初始化式是在构造函数中,this指针可用于a的表达式列表mem-initializer指向被初始化的对象。
和
成员函数(包括虚成员函数,10.3)可以调用正在构建的对象。
您只需要避免访问尚未构造的内容。这可以包括在初始化所有基类之前调用成员函数:
class Derived : public Base {
public:
Derived()
: Base(foo()) // foo() undefined because base class not initialized
{
}
int foo() { return 0; }
};
相关文章:
- BOOST线程:线程还是进程
- 如何解决传递给boost线程的函数中的歧义
- cpp 为什么 boost::线程内部的循环不遍历所有值并且推送相同的值?
- C 从类的构造函数运行Boost线程
- 重新分配独立的boost ::线程安全吗?
- Boost::线程如何在主线程和工作线程之间同步
- 链接Boost线程库
- BOOST ::线程内会成员功能调用返回unique_lock Instantiation错误
- Boost ::线程何时终止?如何管理Boost ::线程
- 链接到boost ::线程失败
- 在C 中处理Boost线程条件
- Poco任务管理器/Boost线程混合和匹配
- 创建一个 boost::线程 带有 boost::bind() 或不带
- 为不受支持的平台调整Boost线程/进程
- 删除boost ::线程后代
- 我需要在Boost线程功能中调用Unlock()
- C OPENCV图像在Boost线程中不显示
- boost ::线程在删除可加入线程时存在什么问题
- 增强异步插座和Boost ::线程
- 如何使boost ::线程入睡