提高线程对象的生命周期和线程生存期

时间:2013-06-14 10:13:28

标签: c++ boost boost-thread dbus

我想从线程入口函数退出一起删除boost线程对象。如果我启动线程函数并将共享指针传递给拥有线程对象实例的对象,然后,当线程函数退出时,它会同时与线程对象一起销毁此对象,这是不是错了吗?

编辑: 也许我会描述为什么我想这样做。我必须使用低级别的dbus API。我想要做的是创建适配器类,它将启动自己的线程并等待传入​​消息,直到DISCONNECT消息到达。如果它到达我想关闭线程并杀死适配器本身。适配器是一个活动对象,它运行发送到其调度程序的方法。在从dbus读取消息后,这些方法再次将自己置于调度程序队列中。但是如果它是DISCONNECT消息,它们不应该发送方法而只是退出调度程序线程,销毁Adapter对象。嗯,看起来太复杂了......

3 个答案:

答案 0 :(得分:2)

the Boost.Thread documentation您可以看到不应删除可连接的线程对象,否则将调用std::terminate

所以你应该保证,如果线程是可连接的,那么应该在拥有该线程的对象的析构函数中调用join()detach()注意:如果线程本身正在销毁该对象,则join()不是一个选项。线程会尝试连接自己,导致死锁。

但是,如果记住这些限制,可以从自己的执行线程中销毁一个线程。

答案 1 :(得分:1)

你可以这样做,但你可能不应该这样做。

boost::thread对象的主要目的是可以监视关联的线程。在大多数情况下,拥有线程监视器本身并没有多大意义。

正如其他答案所建议的那样,你可以detach线程并抛弃boost::thread对象。这样做通常被认为是不好的风格,除非监控职责首先转移到另一个对象。例如,许多简单的工作线程在完成时设置了未来。未来已经提供了我们需要的所有监控,因此我们可以分离线程。

你永远不应该完全分离一个线程,这样你就失去了监视它的所有方法。你必须至少能够保证一个干净的关闭,如果你完全拆除它们,除了最琐碎的线程之外的所有线程都不可能。

答案 2 :(得分:0)

我不确定这是否可以解决您的使用案例,但对我来说听起来就像您不必这样做。

boost :: thread对象的生命周期不一定与线程本身一致。意思是如果你不在乎你也可以启动线程,在它上面调用detach()并使对象超出范围。然后它被删除但线程仍然会运行,直到它的功能完成。唯一的问题是,你将无法加入它。因此,如果您的程序在线程仍然运行时完成,它将崩溃。

如果您关心这些内容,问题可能是错误的,因为在这种情况下,您将存储对象并在删除之前调用join()。