2010-05-10 112 views
4

我正在使用boost :: thread来处理队列中的消息。 当第一条消息到来时,我启动一个消息处理线程。 当第二条消息到来时,我检查消息处理线程是否完成。我如何知道升压线程是否完成?

如果这样做我开始一个新的 如果没有完成我什么也没做。

如何知道线程是否完成?我试着用joinable(),但它不工作,因为当线程完成时,它仍然可以连接。

我也尝试立即中断这个过程,并在我的线程末尾添加一个中断点,但它不起作用。

感谢

编辑:

我想有我线程睡一个不确定的时间,醒来时,信号被触发。

平均要做到这一点是提高:: condition_variable

回答

1

为每个传入消息产生一个新线程的效率非常低。你应该看看Thread pool pattern

编辑:

对不起,jules,我误解了你的问题。我建议你看看producer-consumer模式。看看这个article关于如何使用boost条件变量推出自己的阻塞队列。英特尔的Thread Building Blocks也有阻塞队列的实现。

查看关于现有无锁队列实现的SO question

希望这会有所帮助。

+0

我的想法是只有一个处理线程。当它完成处理时,我希望它能够睡眠,并且一旦有新消息到来就能够唤醒它。你知道如何做到这一点与提升? – Arthur 2010-05-11 06:36:17

+0

你会想要一个生产者 - 消费者队列。看到我上面的附录。 – 2010-05-11 14:25:48

+0

我很了解生产者 - 消费者模式。我需要的是一种唤醒事件上线程的方法(当缓冲区不再空时)。我不知道有什么办法做到这一点。 – Arthur 2010-05-12 14:46:30

0

您是否尝试过检查get_id()与升压:: this_thread :: get_id()。如果它们匹配的线程不存在。但是这只会在你退出线程时才会发生。

+0

即使线程完成,线程ID也总是不同。 如何退出线程? – Arthur 2010-05-10 09:45:42

+0

通过退出线程我只是表示它应该到线程停止并返回的点。但我想joinable()可以做同样的事情。 – jpyllman 2010-05-10 09:53:59

2

就我所知,应该使用join()方法来等待线程执行的结束。您可以在timed_join()超时时使用它。

你可以用interrupt()中断线程。在这种情况下,在线程内部,如果执行到达中断点(boost :: this_thread :: sleep()或boost :: this_thread :: interruption_point()),将发生异常。你可以捕获线程内的异常,然后关闭它。

相关问题