2010-12-18 97 views
0

我正在考慮使用單個循環線程函數來利用多線程編程的想法。然而,這是一個簡單的理論,所以我想知道你的想法是什麼,因爲它可能是錯誤的。使用單個(額外)線程的多線程編程

一個例子可能是單個函數在應用程序周圍分散的地方被多次調用。雖然很難簡單地在它上面進行並行編程,但是可以有一個額外的線程循環着一個檢查「我們是否需要這個函數」的布爾值,如果是,那麼執行它。

即使是遠程可能有應用程序?

我懷疑它會因爲通過布爾/ var關於它的「調用」與實際需要的函數的執行之間的「滯後」而變得緩慢。

編輯:我想到了一個快速函數,我想如果函數調用非常緩慢(完成),它可能是可行的。

然後,我們需要處理線程安全性和併發性,所以這可能是錯誤的。

+0

請指定您的編程語言。 – jgauffin 2010-12-18 12:36:02

回答

1

你可以觸發一個線程來執行一個函數,但調用者可能仍然想等待結果。線程的定義對於可以以孤立形式完成的過程非常有用。不只是任何呼叫都適合進行線程化。

如果你定義了這樣一個過程,那麼一次執行多個線程可能就好了。我不會看到有任何使用一個單獨的線程,只是調用隊列中的函數。例如,它可能在報告工具中有一些用處。爲了最大限度地減少數據庫負載,您可以選擇一次只執行一個或少量的報告。報告完成後,線程可以從隊列中提取新報告。

要實現這樣的事情,我會構建(並實際已經構建)連接池和胎面池。如果你也想建立這樣的事情,我鼓勵你去尋找互斥體(原子/關鍵部分)和信號量。

1

當你使用它們(比如任何東西)時,線程會變得更好,但想法是分派到可獨立於其他任務運行的輔助線程處理任務。讓你走的一個很好的練習是編寫一個線程,根據需求進行一些計算,然後通過回調函數返回結果。

在開發移動應用程序時相當經常出現的一個例子是需要從Web服務器獲取圖像。這是一個耗時的操作,它可能會失敗,所以我希望它在單獨的線程上發生。如果我的應用程序獲得圖像,那很好。如果失敗了,那也沒什麼大不了的。

讓我們說,用戶正在運行我的應用程序,我們應該顯示一些藝術品。

  • 首先,我展示一個佔位符圖像或者一個微調
  • 我創造了一些參數一個新的線程(通過一個結構或類似的通過)
  • 參數可能是來查找URL和要調用的函數一旦我有了形象。
  • 新線程啓動並查找URL。如果失敗,它就會退出。
  • 如果它獲取圖像並驗證它是正確的,它現在調用傳入的回調函數將圖像傳遞給需要它的線程。
  • 有很多方法可以跨線程交付數據,但您必須瞭解併發問題(競爭條件,死鎖)以及它們如何發生。

在最簡單的情況下,兩個線程都會共享一個互斥鎖。這種類型的對象通過保護數據資源來幫助促進線程之間的同步。傳遞圖像的線程會鎖定互斥鎖。這使得它可以獨佔訪問一個數據資源,可能是一個圖像隊列,它在這個數據資源上粘貼圖像。然後它解鎖互斥體。它的工作現在完成,因此圖像提取器線程可以退出。

在運行過程中,想要圖像的線程需要定期檢查圖像隊列以查看是否有新圖像。它鎖定互斥鎖,檢查隊列並在找到圖像時複製圖像,然後解鎖互斥鎖。

這是使用共享資源的線程最基本的情況之一。隨着您的瞭解越來越多,除了互斥體以外,您還可以發現其他用於信號線程和其他許多類型操作的結構。

有關線程和同步的更多信息的一本很好的書是Andrew Tanenbaum的操作系統書。它通常需要閱讀大部分計算機科學專業的學生,​​並且會教你一筆鉅款。看看here