我有一个处理zmq消息的类。如果收到消息,则该类通知其观察者。这个观察者创建一个boost :: thread来解析收到的zmq消息。消息解析后,观察者启动另一个执行已解析命令的线程。
因此,有一个观察者为每个传入消息创建一个线程。如何在解决消息后确保创建的线程被安全销毁?此外,在解析程序线程中启动的线程会发生什么。最后还必须安全地销毁该线程。
我认为这有一个简单的解决方案但是我缺乏多线程的经验而且没有什么去谷歌...
编辑: 当他们自己返回一个值时,我是否还要关心线程?
答案 0 :(得分:0)
可以分离或连接线程。如果你加入,你的主线程将一直阻塞直到它完成。如果分离,则线程将一直运行直到完成或应用程序终止。假设后者不会发生,这很好。
专门针对boost :: threads(顺便说一句,你有权访问std :: thread - 介绍C ++ 11)..
当代表执行线程的boost :: thread对象被破坏时,线程将被分离。一旦线程被分离,它将继续执行,直到在构造中提供的函数或可调用对象的调用完成,或程序终止。也可以通过在boost :: thread对象上显式调用detach()成员函数来分离线程。在这种情况下,boost :: thread对象不再代表现在分离的线程,而是代表Not-a-Thread。
为了等待执行的线程完成,必须使用boost :: thread对象的join()或timed_join()成员函数。 join()将阻塞调用线程,直到boost :: thread对象表示的线程完成。如果boost :: thread对象表示的执行线程已经完成,或者boost :: thread对象表示Not-a-Thread,则join()立即返回。 timed_join()类似,只是如果等待的线程在指定的时间过去后没有完成,则对timed_join()的调用也会返回。
顺便说一句,除非此应用程序用于少量连接,否则请考虑一下您是否确实需要每个请求一个线程。有一些开销(10微秒,默认情况下有时会在1-2MB内存之间)。