我使用boost :: thread来处理队列中的消息。 当第一条消息出现时,我启动了一个消息处理线程。 当第二条消息出现时,我检查消息处理线程是否完成。
如果完成,我会开始一个新的 如果不这样做,我什么都不做。
如何知道线程是否已完成?我尝试使用joinable()但它不起作用,因为当线程完成时,它仍然可以连接。
我还试图立即中断该进程,并在我的线程末尾添加一个中断点,但它没有用。
由于
编辑:
我想让我的线程在不确定的时间内休眠,并在触发信号时唤醒。
这样做的意思是boost :: condition_variable
答案 0 :(得分:2)
据我所知,你应该使用join()方法等待线程执行的结束。您可以使用timed_join()暂停使用它。
您可以使用中断()中断线程。在这种情况下,如果执行到达中断点(boost :: this_thread :: sleep()或boost :: this_thread :: interruption_point()),则在线程内部将发生异常。你在线程中捕获了异常,然后你可以关闭它。
答案 1 :(得分:1)
为每个传入的消息生成一个新线程是非常低效的。你应该看看Thread pool pattern。
编辑:
对不起,jules,我误解了你的问题。我建议你看一下producer-consumer模式。查看此article有关如何使用boost条件变量滚动自己的阻塞队列的信息。英特尔的Thread Building Blocks也有一个阻塞队列实现。
查看此SO question有关现有无锁队列实现的信息。
希望这有帮助。
答案 2 :(得分:0)
您是否尝试使用boost :: this_thread :: get_id()检查get_id()。如果匹配则线程不存在。但只有退出线程才会发生这种情况。