我正处于开发的设计阶段,我正在考虑在C ++中使用多线程来实现某些功能。我熟悉多线程的基础知识,但希望让其他人接受我的想法。我还没有选择多线程库(倾向于Boost),但我的问题可能与所选的库无关。
基本上我会有一个类(让我们称之为CommandGenerator)在while循环中执行(直到终止)并检查由另一个软件填充的命令的消息队列。每次CommandGenerator从队列中获取消息时,我都希望它能够生成一个在后台执行的线程,并处理刚刚从队列中取出的数据。同时我希望CommandGenerator继续运行并再次绕过while循环并拉出任何新消息并再次生成更多线程。这在概念上是否可行?我可以继续生成线程并让它们在后台运行,直到它们完成,同时代码继续循环并检查队列吗? CommandGenerator不需要控制线程。它们能够在创建后独立执行并保证终止,但可能需要一分钟才能完成执行(它们在执行前等待从队列中取出的消息中指定的一定时间)。
赞赏任何意见。
答案 0 :(得分:2)
您想要做的事情被称为“生产者 - 消费者”模式。
我强烈建议不要为收到的每条消息创建一个新线程:如果你这样做了,你一次收到太多消息,就会堵塞机器。
相反,拥有固定数量的消费者线程来读取消息队列,并让它们一次处理一条消息。如果一次发出太多消息,它们将被存储在队列中,等待处理。
由于在获取消息和实际处理消息之间存在延迟,因此解决方案IMHO不会为每个消息生成一个线程,而只是为了增加消费者线程的数量。这样,您可以控制资源使用。您需要多少线程完全取决于您的应用程序,您必须自己找到它。
至于实现,如果你使用C ++ 11,你只需要std :: thread / std :: mutex和std :: condition_variable。如果使用C ++ 03,则boost具有等效的类。
答案 1 :(得分:0)
是的,你的概念非常可行。但是,名义上你可以生成多少个线程的上限。但是绑定可能很大。
答案 2 :(得分:0)
您的概念是可行的,并且非常接近一些常规的多线程模式。一种模式是使用具有共享线程安全队列。你有一个生产者,在这种情况下你的CommandGenerator
将工作推入队列。然后,您将拥有等待将某些内容放入队列的消费者线程。当一个项目被推入队列时,一个(并且只有一个)线程能够关闭该项目并对其进行处理。
实现此目的的一种方法是使用std::thread
和std::mutex
。
根据您使用的编译器,您应该认真看看std::async。这可以消除需要知道将创建什么线程以及何时创建的负担。
您需要确保在需要停止处理时知道会发生什么。例如,当您的CommandGenerator
停止时,是否应该等待处理线程停止?命令处理线程如何停止?队列中的项目会发生什么?这些是您需要考虑的设计决策(如果您还没有)。