1

我想在退出线程入口函数的同时删除提升线程对象。如果我启动线程函数并将共享指针传递给对象,该对象拥有线程对象实例,然后,当线程函数退出时,它会同时销毁 this 对象和线程对象,这是否有问题?

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

4

3 回答 3

2

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

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

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

于 2013-06-14T12:22:14.240 回答
1

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

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

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

你永远不应该完全分离一个线程,这样你就失去了监控它的所有方法。您至少必须能够保证完全关闭,如果您完全分离它们,除了最微不足道的线程之外,这对于所有线程都是不可能的。

于 2013-06-14T12:33:11.670 回答
0

我不确定这是否解决了您的用例,但在我看来,您不必这样做。

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

如果您确实关心这些东西,那么问题可能是错误的,因为在这种情况下,您将存储对象并在删除之前对它们调用 join() 。

于 2013-06-14T12:18:07.057 回答