2011-02-25 59 views
1

我有一個項目,我想將其轉換爲多線程應用程序。有什麼可以做,使之成爲多線程應用程序如何將我的項目轉換爲多線程應用程序

列出的東西的事情要做,以轉換爲多線程應用上的共享變量
e.g互斥鎖。
我無法找到一個問題,列出所有那些在單個引擎蓋下。 項目在C

+2

如果你的應用程序只有一個線程,那麼你不必擔心線程安全。 – Nick 2011-02-25 14:06:33

+0

首先閱讀http://blogs.msdn.com/b/ericlippert/archive/2009/10/19/what-is-this-thing-you-call-thread-safe.aspx – 2011-02-25 14:06:53

+0

我沒有得到你的觀點。我想我的應用程序多線程。我已經採取了一些預防措施,直到現在才使它更安全 – ashmish2 2011-02-25 14:07:31

回答

2

單線程應用程序不必關心是線程安全的。

當您有多個嘗試訪問共享資源的線程時,會出現此問題。那時候,你一定要擔心。

所以,不用擔心。


EDIT(問題被編輯後):

你需要經過以下幾個環節。

也爲將單多線程application.Check了很好的建議。

+0

gud鏈接,但我想列出的事情要做的時候多線程在C++ – ashmish2 2011-02-25 17:35:21

+0

我猜這一個「建議 - 單線程到多線程應用程序」,僅適用於C++ – 2011-02-25 17:37:42

-2

沒有一個更詳細的描述你的應用程序,幾乎不可能給你一個完整的答案。

在理解線程的同時,給出一些好的建議。

但是,最重要的是,每次訪問全局變量或使用指針時,都有可能需要在互斥體中執行該操作。

此維基百科頁面應該是一個良好的開端:http://en.wikipedia.org/wiki/Thread_safety

+0

-1相當糟糕的建議。 – 2011-02-25 14:12:04

1

最大的問題是,在一般情況下,在設計應用程序時,它是非常困難的選擇單個線程,然後再添加多線程。選擇是你要努力實現的設計習慣的基礎。下面是一些你應該注意朝向和如何修改代碼的東西一個簡短而可憐的引導(注意,這些都不是一成不變的,總有辦法解決):

  1. 刪除所有可變全局變量。我會說這也適用於單線程應用程序,但這只是我。
  2. 將「const」作爲第一遍添加到儘可能多的變量中,以決定狀態更改的位置並記錄編譯錯誤。這並不是說「將所有變量都變爲const」。找出問題所在的地方只是簡單的黑客攻擊。
  3. 對於那些可變和共享的項目(也就是說,如果沒有編譯警告,你不能把它們保留爲const),在它們周圍放置鎖。應該記錄每個鎖。
  4. 接下來,介紹你的線程。您可能要承受很多死鎖,活鎖,競爭條件,以及不像您的單線程應用程序對您的應用程序運行的方式和順序進行假設。
  5. 開始削減不需要的鎖。也就是說,看看你的線程之間不能共享的可變狀態。這些鎖是多餘的,需要去。
  6. 接下來,研究你的代碼。在這一點上,確定你的線索問題在哪裏比科學更具藝術性。雖然,有這樣的體面的校長如何去做,這就是我所能說的。

如果這聽起來太費勁了,現在是時候看待Actor模型的併發性。這將類似於創建幾個不同的應用程序,這些應用程序通過消息傳遞方案互相呼叫。我發現參與者不僅直觀而且大量友好,以確定您可能遇到線程問題的位置和方式。設立演員時,幾乎不可能不考慮所有「假設」。

就個人而言,在處理單線程到多線程的轉換時,我儘可能少地實現項目目標。這只是更安全。

1

這很大程度上取決於您打算如何使用線程。你的程序做什麼?你想在哪裏使用線程?那些線程會做什麼?

您將需要弄清楚這些線程將共享什麼資源並應用適當的鎖定。由於您是從單線程應用程序開始的,因此最大限度地減少共享資源以簡化移植操作。例如,如果你現在有一個單一的GUI線程,並且需要在多個線程中做一些複雜的計算,產生這些線程,但沒有直接觸及GUI的任何數據 - 而是發送異步消息給GUI線程(如何執行此操作取決於操作系統和GUI庫),並讓它在GUI線程本身上以序列化方式處理GUI線程數據的任何更改。

作爲一般建議,不要簡單地添加線程無所畏懼。您應該知道確切地說哪些變量和數據結構在線程之間共享,它們在哪裏被訪問以及爲什麼。你應該保持所說的分享到最低限度。

相關問題