0

我正处于开发的设计阶段,正在考虑在 C++ 中使用多线程来实现一些功能。我熟悉多线程的基础知识,但想让其他人接受我的想法。我还没有选择多线程库(倾向于 Boost),但我的问题可能与选择的库无关。

基本上我会有一个类(我们称之为CommandGenerator)在一个while循环中执行(直到终止)并检查由另一个软件填充的命令消息队列。每次 CommandGenerator 从队列中获取消息时,我希望它生成一个在后台执行并处理刚从队列中取出的数据的线程。同时,我希望 CommandGenerator 继续运行并再次绕过 while 循环并提取任何新消息并再次产生更多线程。这在概念上可能吗?我可以继续生成线程并让它们在后台运行直到它们完成,而代码继续循环并检查队列?CommandGenerator 不需要控制线程。

任何输入表示赞赏。

4

3 回答 3

2

您想要做的就是所谓的“生产者-消费者”模式。

我强烈建议不要为收到的每条消息创建一个新线程:如果你这样做并且一次收到太多消息,你可能会堵塞机器。

相反,拥有固定数量的消费者线程来读取消息队列,并让它们一次处理一条消息。如果一次有太多消息,它们将被存储在队列中,等待处理。

由于在获取消息和实际处理消息之间存在延迟,恕我直言,解决方案再次不是为每条消息生成一个线程,而只是增加消费者线程的数量。通过这种方式,您可以控制资源使用。您需要多少线程完全取决于您的应用程序,您必须自己找出答案。

至于实现,如果你使用 C++11,你只需要 std::thread / std::mutex 和 std::condition_variable。如果您使用 C++03,则 boost 具有等效的类。

于 2013-04-25T12:57:26.727 回答
0

您的概念是可行的,并且非常接近一些常规的多线程模式。一种模式是使用共享线程安全队列。您有一个生产者,在这种情况下,您CommandGenerator将工作推到队列中。然后,您将拥有等待将某些内容放入队列的消费者线程。当一个项目被推入队列时,一个(并且只有一个)线程能够取出该项目并对其进行处理。

实现这一点的一种方法是使用std::threadand std::mutex

根据您使用的编译器,您应该认真查看std::async。这可以消除需要知道将创建哪些线程以及何时创建的负担。

您需要确保知道需要停止处理时会发生什么。例如,当您CommandGenerator停止时,是否应该等待处理线程停止?命令处理线程如何停止?仍在队列中的项目会发生什么?这些是您需要考虑的设计决策(如果您还没有考虑的话)。

于 2013-04-25T13:11:44.830 回答
0

是的,你的概念是相当可行的。然而,名义上你对可以产生多少线程有一个上限。界限可能很大。

于 2013-04-25T12:55:16.973 回答