簡體   English   中英

async和await關鍵字不會導致創建其他線程嗎?

[英]The async and await keywords don't cause additional threads to be created?

我糊塗了。 一個或多個Task如何在一個線程上並行運行? 我對並行性的理解顯然是錯誤的。

MSDN的比特我無法理解:

async和await關鍵字不會導致創建其他線程。 異步方法不需要多線程,因為異步方法不能在自己的線程上運行。 該方法在當前同步上下文上運行,並僅在方法處於活動狀態時在線程上使用時間。

..和:

在啟動任務和等待任務之間,您可以啟動其他任務。 其他任務隱式並行運行,但不會創建其他線程。

它們並不是並行運行,而是輪流運行。 當正在運行的任務阻止進度時,它會將其狀態和控制權存儲到就緒任務中。 這是合作的多任務處理,而不是真正的並行性。

線程根據樣本原理運行。 但是,我想強調幾個關鍵的區別。

首先,僅僅因為async / await不是OS線程:

  • 任務不會看到不同的線程ID
  • 當任務產生時,線程本地存儲不會自動上下文切換。

其次,行為的差異:

  • async / await使用協作式多任務處理,Win32線程使用搶占式。 因此,所有阻塞操作必須使用async / await模型明確地產生控制。 因此,您可以通過對未編寫為yield的函數進行阻塞調用來阻止整個線程及其所有任務。
  • 任務不會在多處理系統上並行執行。 由於重新引入被控制,這使得保持數據結構一致性變得更加容易。

正如Stephen在評論中指出的那樣,如果使用多線程同步上下文,則可以在多個OS線程中同時執行(以及所有復雜性和潛在的競爭條件)。 但是MSDN引用是關於單線程上下文的情況。

最后,在其他地方使用相同的設計范例,您可以通過研究這些來學習很多關於async / await的良好實踐:

  • Win32 Fibers (使用與線程相同的調用樣式,但是合作)
  • Win32 重疊I / O操作,Linux aio
  • 協同程序

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM