什麼是多線程程序,它是如何工作的?我讀了一些文件,但我很困惑。我知道代碼是逐行執行的,但我無法理解程序如何管理它。
一個簡單的答案將不勝感激。例如請(只有動畫!)什麼是多線程程序,它是如何工作的?
回答
什麼是多線程程序,它是如何工作的?
關於這個問題的有趣的部分是關於這個話題的完整書籍,但它仍然是難以捉摸的很多人。我將嘗試按照下面詳細說明的順序進行解釋。
請注意,這只是爲了提供一個要點,像這樣的答案永遠不會公平的深度和細節的要求。至於影片,最好的,我所遇到的付費訂閱(Wintellect的和Pluralsight),檢查一下你可以聽他們試驗的基礎上,假設您還沒有訂閱的一部分:
Wintellect by Jeffery Ritcher (從他的書,通過C#CLR,具有相同的一章線程基礎)
說明訂購
- 什麼是線程?
- 爲什麼要介紹主題,主要目的?
- 陷阱和如何避免它們,使用同步構造?
- Thread與ThreadPool?
- 多線程編程API的發展,如並行API,任務API
- 併發集合,用法?
- 異步等待,線程,但沒有線索,爲什麼他們是最好的IO
什麼是線程?
它是軟件實現,它純粹是Windows操作系統概念(multi-threaded architecture)
,它是最低工作單元。 Windows OS上的每個進程至少有一個線程,每個方法調用都在線程上完成。每個進程可以有多個線程,並行執行多個任務(提供硬件支持)。 其他Unix
基於OS的操作系統是多進程體系結構,實際上在Windows中,即使是最複雜的一塊軟件,如Oracle.exe
也有單一進程和多個線程用於不同的關鍵後臺操作。
爲什麼要介紹主題,主要目的?
相反的看法,即併發的主要目的,是穩健性,導致引進的線程,想象在Windows上每一道工序都使用同一個線程(在最初的16位版本)上運行,並從他們的一個進程崩潰,這只是意味着系統在大多數情況下重新啓動。並行操作的線程使用,可以在每個進程中調用多個並行操作,這些並行操作的使用情況如圖所示。實際上,充分利用多核處理器是非常重要的。
陷阱和如何避免使用同步構造?
更多的線程意味着更多的工作同時完成,但問題來了,當相同的內存訪問,特別是對於Write
,因爲這時候它可以導致:
- 內存損壞
- 競爭條件
另外,另一個問題是線程是一個非常昂貴的資源,每個線程都有一個線程環境塊,內核內存分配。同樣爲了調度處理器核心上的每個線程,花費時間用於上下文切換。誤用很可能會導致巨大的性能損失,而不是改進。 爲了避免與線程相關的腐敗問題,使用Synchronization結構很重要,如基於需求的lock, mutex, semaphore,
。 Read始終是線程安全的,但Write需要適當的同步。
Thread與ThreadPool?
真正的線程不是我們在C#.Net中使用的,這只是調用Win32線程的託管包裝。挑戰依然存在於用戶嚴重濫用的能力上,比如調用多於所需的線程數量,分配處理器關聯度,因此我們請求標準池對工作項目及其窗口進行排隊並不是更好,因爲它決定何時新線程是必需的,當一個已經存在的線程可以安排工作項。線程是一個昂貴的資源,需要在使用中進行優化,否則它可能是不好的。
演化多線程編程,像並行API,API任務的
從.NET 4.0開始,各種新的API的Parallel.For,Parallel.ForEach數據paralellization和任務並行化,取得了在系統中引入併發很簡單。這些API再次在內部使用線程池。任務更像是將來某個時間安排工作。現在引入併發就像是一件輕而易舉的事情,儘管仍然需要同步構造來避免內存損壞,可以使用競爭條件或線程安全集合。
併發集合,用法?
實現比如ConcurrentBag, ConcurrentQueue, ConcurrentDictionary
的System.Collections.Concurrent
一部分是固有的線程安全的,使用spin-wait
比明確Synchronization
更容易和更快。管理和工作也更容易。還有另外一組API,如ImmutableList
System.Collections.Immutable
,可通過nuget獲得,它們通過內部創建數據結構的另一個副本來線程安全。
異步等待,線程,但沒有線索,爲什麼他們是最好的IO
這是一個重要的方面的併發意味着IO
電話(磁盤,網絡),到現在爲止討論的其它API,是爲了基於計算的併發性,所以線程是重要的,使其更快,但對於IO調用線程沒有用,除了等待呼叫返回,IO調用在基於硬件的隊列上處理IO Completion ports
一個簡單的比喻可能會發現在廚房。
您之前可能已經使用過配方烹飪 - 以指定配料開始,按照配方中指示的步驟進行,最後您(希望)準備好美味的菜餚。如果你這樣做,那麼你已經執行了一個傳統(非多線程)程序。
但是,如果你必須做一頓全餐,其中包括一些不同的菜餚呢?簡單的做法是從第一個配方開始,按照配方說的一切,當完成時,把完成的菜(和第一個配方)放在一邊,然後從第二個配方開始,完成它所說的一切,把第二道菜(和第二道菜)放在一邊,等等,直到你們一個接一個地完成所有的食譜。這會起作用,但你最終可能在廚房裏花費10個小時,當然最後一道菜準備好吃的時候,第一道菜可能會很冷並且不易吃。
所以相反,你可能會做大多數廚師做的,也就是開始在同一時間處理幾個食譜。例如,你可以把烤箱放在烤箱裏烤45分鐘,但不要坐在烤箱前面烤45分鐘,烤45分鐘就可以做菜。當烤箱定時器響起時,您放下蔬菜刀,將煮好的烤肉從烤箱中取出並放涼,然後再回去切菜,等等。如果你能做到這一點,那麼你就可以成功地完成多個食譜/程序的多任務處理。也就是說,你並不是一次從事多種食譜的工作(你仍然只有兩隻手!),但是你可以根據需要從一種食譜到另一種食譜來回跳動,從而在多項任務中取得進展,而不是甩了你的大拇指。做得很好,你可以在很短的時間內準備好吃完所有的食物,而且大約在同一時間,一切都會變得熱烈而新鮮。如果你這樣做,你正在執行一個簡單的多線程程序。
然後,如果你想要得到真的想你可能會僱用一些其他的廚師在你的廚房工作,這樣你就可以在一定的時間內準備更多的食物。如果你這樣做,你的團隊正在做多處理,每個廚師都參與全部工作的一部分,並且他們全部同時工作。請注意,每個廚師都可能正在處理多個食譜(即多任務),如前一段所述。
至於如何電腦做這種事情(沒有關於廚師更多的類比),它通常使用一個準備運行的線程和計時器的列表來實現它。當定時器關閉時(或者當前正在執行的線程暫時沒有任何操作,因爲例如它正在等待從慢速硬盤驅動器或其他東西中加載數據),操作系統執行一個上下文切換,它暫停當前線程(通過將其放置在某個列表中,不再執行該線程代碼中的指令),然後從可運行的線程列表中提取另一個準備運行的線程,並開始執行來自該線程的指令代替線程的代碼。這種情況只要需要就會重複出現,而且每隔幾毫秒就會發生一次上下文切換,因此即使在單核CPU上,也會出現多個程序「同時」運行的錯覺。(在一個多核心CPU時,它同樣的事情在每個內核上,而在這種情況下,它不再只是一種假象;多個節目真的是在同一時間運行)
'多線程'段提醒我更多' asynchronicity'。正如你所提到的,這個線程只是從一個任務跳轉到另一個任務,並且實際上沒有其他線程被創建。那麼將它稱爲「多線程」有效嗎? – Gabrielius
線程不會從一個任務跳轉到另一個任務;該線程(根據定義)是一系列相關指令。它是從一個任務跳到另一個任務的* CPU *(即類比中的廚師,而不是配方),即從線程A執行一些指令,然後從B執行一些指令,然後從C中執行一些指令,然後再從A中執行一些指令。 –
@Gabrielius(你*可以*編寫一個單線程程序,當然做了同樣的事情,但那時你基本上會在該單線程中實現你自己的原始任務調度程序) –
任何僅僅是一個參考,請添加評論,而不是答案,因爲這裏沒有價值添加這裏 –
這應該是評論第一。你能看到我的問題嗎?我的問題問動畫。 – saftargholi
@arashzgh:明天你會添加到你的問題,你只需要使用WPF的例子? –
實際上多線程在同一時間做多的過程一起使用。並且您可以完成並行流程。
它實際上是多線程一起做多個進程。並且您可以完成並行流程。你可以從你的主線程中獲取任務然後執行一些其他的方法並完成。
請使用評語部分..! –
@RuchaBhatt好的。謝謝 – 2017-01-02 09:54:09
- 1. 什麼是工作線程?
- 2. 什麼是多線程應用程序?
- 3. 它是多線程時的進程狀態是什麼?
- 4. 什麼是多線程?
- 5. Jenkins的種子工作是什麼?它是如何工作的?
- 6. 什麼是延遲後臺工作?它是如何工作的?
- 7. 什麼是IOR文件,它是做什麼的,它是如何工作的?
- 8. 什麼是線程?
- 9. 什麼是線程?
- 10. Ext.net PageProxy:它是什麼,它是如何工作的?
- 11. 這個auto_ptr程序是如何工作的以及它做了什麼?
- 12. 什麼是進程/收割者,爲什麼它不工作?
- 13. Ruby守護進程 - 什麼是監視器,它是如何工作的?
- 14. 如何檢查我的多線程程序是否在C++中正常工作?
- 15. 線程池RejectedExecutionHandler它是如何工作的
- 16. 什麼是Tomcat ROOT應用程序,它的優點是什麼?
- 17. 多線程是不是程序版本
- 18. nodejs單線程?如果有很多併發請求,它是如何工作的
- 19. Laravel的應用程序密鑰 - 它是什麼以及它是如何工作的?
- 20. Web應用程序的最佳工作流程是什麼?
- 21. 什麼是創建iOS應用程序的工作流程
- 22. OpenGL ES 2.0多程序或多着色器或什麼?它是如何工作的?
- 23. promisifyAll如何工作,或者它的工作要求是什麼?
- 24. IIS7的工作進程是什麼?
- 25. 什麼是複製的指針,它們是如何工作的?
- 26. 什麼是SQL中的binary_checksum?它是如何工作的?
- 27. 什麼preprocessing.scale()做什麼?它是如何工作的?
- 28. 接收調度程序 - 它是什麼?
- 29. 從工作線程調用更新UI線程是如何工作的?
- 30. C#:爲什麼我的後臺工作線程信號完成時,它不是?
如果你認爲程序執行是一個小精靈,在你的計算機內部執行你分配的任務,那麼圖片上的兩個或三個精靈會在同一時間運行。這是多線程。通過任務和線程,他們通常不會做彼此獨立的事情。在Parallel中,他們都在一個循環中工作,以查看誰可以先完成。作爲一名程序員,你需要確保所有精靈都有事情要做,並且一個人不會在午餐時間出現,只能在WHILE循環周圍尋找另一個關卡。發生這種情況時他們會生氣。 –
@arashzgh請參閱[使用Web Workers](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers)_「Web Workers爲Web內容提供了一種在後臺運行腳本的簡單方法線程。工作線程可以在不干擾用戶界面的情況下執行任務。「_你想要實現什麼? – guest271314
Stackoverflow文檔有一個關於這個(線程)的主題有很多例子:http://stackoverflow.com/documentation/c%23/51/threading – Mellow