2013-04-25 31 views
0

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

基本上我将有一个类(让我们称之为CommandGenerator),其在一个while循环执行(直到终止),并检查由另一个软件填充命令的消息队列。每次CommandGenerator从队列中获取消息时,我都希望它生成一个在后台执行的线程,并处理刚刚从队列中取出的数据。同时,我希望CommandGenerator继续运行并再次绕过while循环,并拉取所有新消息并再次产生更多线程。这在概念上是可能的吗?我可以继续产卵线程,让它们在后台运行直到它们完成,而代码继续循环并检查队列吗? CommandGenerator不需要控制线程。他们一旦创建就可以独立执行,并保证终止,但可能需要一分钟才能完成执行(它们在执行之前等待消息中指定的一定时间从队列中拉出)。

任何输入表示赞赏。

+1

我建议你使用内置的C++ 11的'threading'模块。 – Elazar 2013-04-25 12:53:36

+1

C++在其标准库中包含线程支持。请参阅''标题。 – 2013-04-25 12:54:40

+2

您是否熟悉生产者 - 消费者或线程池模式等多线程概念? – 2013-04-25 12:55:08

回答

0

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

2

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

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

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

既然你已经获取的信息和实际处理这之间的延迟,再解决恕我直言不产卵每个消息一个线程,但只是增加你的消费线程数。这样可以控制资源使用情况。你需要多少线程完全取决于你的应用程序,你将不得不自己找到。

至于实施,如果你使用C++ 11,你只需要的std ::线程/的std ::互斥和std :: condition_variable。如果你使用C++ 03,那么boost有相同的类。

0

您的概念是可行的并且非常接近一些常规的多线程模式。一种模式是使用共享线程安全队列。你有一个制片人,在这种情况下你的CommandGenerator将工作推到队列中。然后您可以使用消费者线程来等待某些东西放入队列中。当一个项目被推入队列时,一个(并且只有一个)线程能够关闭该项目并处理它。实现这个

一种方法是使用std::threadstd::mutex

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

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

+0

感谢您的意见,我很感激。只是为了澄清,对于这个应用程序,我可以假设CommandGenerator永远不会停止。它所要做的就是启动并等待队列中的消息,并为每个消息创建一个或多个线程。再一次,为了阐明线程创建背后的逻辑,每条消息将有1-5个挂钟时间。在消息中每次都会创建一个线程,并且所有线程都会等待,直到给出的时间为> = currentTime,然后执行某些操作(为了简单起见,就说它只是将它的线程ID打印到stdout)。之后,线程完成。 – user2319717 2013-04-25 14:13:23

+0

与此同时,每个线程都在等待执行(最多一分钟后),但我仍然希望CommandGenerator能够将任何新消息从队列中拉出并产生更多线程。 – user2319717 2013-04-25 14:20:22