2012-11-06 83 views
3

我一直使用腳本語言,比如PHP,頁面運行,完成運行並給出輸出。不過,我想在C++上做一些與之不同的事情,我需要多線程兩個任務。首先,主線程應該運行,(比方說)一個每1秒刷新一次的cpu溫度計,第二個線程應該做其他事情。 (就像讀取windows目錄下的所有目錄一樣。)多任務使用C++。線程或不同的設計?

就這樣說;

  1. 使用線程是我唯一的機會,或者我可以使用不同的編程概念來完成此任務嗎?

  2. 特別是在遊戲中,有大量的東西在後臺運行。例如,人工智能/怪物,圖形引擎,物理引擎,玩家動作,鍵盤互動等。他們在一個單獨的過程中工作,所以它是如何處理的?

回答

3

創建一個只讀cpu溫度計的線程,並且讀取目錄中的每一秒都會被kill。多線程沒有多少收益,但可能會有一些管理線程的麻煩。你可以把你的TASK放在一個列表中,並以第二種方式安排它們。

我不確定遊戲的東西,但我相信他們會對循環中的項目/任務和計劃/檢查/處理進行分類。一些線程掛載是爲了一些專門的任務而創建的,比如套接字通信,GUI渲染等,但是爲每個項目創建一個專用線程,說明一個蠕變已經結束。

我的建議是,如果你可以在一個線程中做到這一點,那麼不應該很容易地將多線程引入到你的應用程序中。多線程會產生像同步問題,線程管理問題等其他副作用。

+0

如何安排單獨的任務,而不需要像定時器或類似的隱式後臺線程? –

+0

設置一個計時器可以做到這一點。 – billz

+0

計時器通常隱含某種後臺線程,除非您正在使用處理器的硬件定時器並直接中斷並在觸發的協同例程中執行任務。 –

0

線程將是正確的選擇恕我直言。

一個替代方案(操作系統相關)是分叉子進程。是的,線程也依賴於OS,但至少對於C++ 11來說,這些線程有標準的抽象。對於非C++ 11應用程序,如果有適當的端口可用,可以很容易地使用爲OS或POSIX pthreads庫提供的各種線程API。

對於非常簡單的操作系統的另一種選擇是使用所謂的協程而不是線程,例如, FreeRTOS提供這種方法。

要闡述你的觀點2):

這需要實現某種形式的共享內存運行自己的執行線程對象之間交換信息和狀態。共享內存需要使用適當的同步機制,例如互斥鎖,讀/寫鎖,信號量等。

在某些特殊情況下,實現您自己的任務調度機制而不是依賴於操作系統可能有意義。但是這也需要一些中斷驅動機制來切換任務執行。

0

它取決於它們之間的具體任務和依賴關係。

當你有不相關的任務時,我會在單獨的進程中運行它們,這裏不需要線程。如果你有強大的耦合,多線程可能是正確的答案。

+0

只要OS環境提供進程,是的。 –

2

我認爲,您的挑戰假定基於任務的併發。 因此,請從異步工作的角度思考它,而不僅僅是基礎線程。但是,許多庫爲併發任務提供了安全,高效和可靠的高級異步API。 我建議如下:

  1. 的Qt與QtConcurrent框架。
  2. 帶有Multithreading子部分的POCO C++庫。
  3. std::async來自C++ 11的模板。或者爲舊環境提供boost :: thread。

我應該指出,標準的std ::異步或升壓更換有基於任務的併發不同的問題(當叉子新的線程,當偷任務不提供許多功能來調整執行的政策,例如,等等)

0

您可以使用多個線程或多個進程。線程和進程之間

一個關鍵的區別是,線程共享一個存儲空間,而每個具有自己的內存空間過程。

如果您的任務需要經常共享對象,例如插入/刪除/搜索/更新圖形中的節點,多線程將允許每個線程使用指針輕鬆訪問圖形。對於多個進程來說這更困難。

如果您的任務不經常共享對象,例如測量溫度,渲染圖像,播放音樂,那麼共享一個內存空間就不會看到太多好處。在這種情況下,多個流程對你來說更好。