2013-04-25 122 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