非同步與執行緒阻塞

2022-02-18 19:33:35 字數 1479 閱讀 1329

返回目錄

非同步,早期開發人員對它有很多誤解,認為不阻塞主線程就是非同步,更有認為不阻塞ui就是非同步,但非同步歸根結底和這兩個東西關係並不大,非同步的出現主要是為了提高執行緒的利用率,讓可用執行緒更高,而不是乙個執行緒只做一件事,這件事沒有完成就不去做下面的事情,這是不正確的,執行緒應該被解放出來!事實上,你如果學過nodejs的話,對單執行緒非阻塞應該更清楚一些,它主要通過方法**來實現非同步的,只是在語法上和c#不太一樣。

誤解1:不阻塞主線程

如果不阻塞主線程的話,你只能開個新執行緒完成這個動作,像一些系統通知,它和主線程的工作流程沒有關係,如果開個新執行緒,與主線程並行執行,這並不是我們說的非同步,這只是多執行緒!它會增加執行緒的開支,使用不當,會影響系統的吞吐量!

誤解2:不阻塞ui

這就更屬於胡扯了,對於乙個工作流來說,必須要按著1,2,3的順序去執行,如果是同步**,它是乙個執行緒從1執行到3,這個執行緒將一直被占用!如果是非同步**,它在執行到1時,執行緒被**到池子,其它人可以使用,當1執行完成後,從執行緒池裡取出乙個新的執行緒繼續執行,這叫非同步!c#的非同步進行友好,使用async,await就可以實現了!

實驗:檢視有效的執行緒剩餘數

//

///執行緒非阻塞,執行緒利用率高

///執行緒await後可以去做其它事

///然後await後面方法結束後再申請新執行緒執行下面的**

/// ///

[route("

~/do5")]

public

async taskdo5()

,completionportthreads:,timer:";

}

我們來看它的i/o執行緒剩餘,多重新整理幾次,一直維持在32766和32765之間

而如果使用同步**,結果就完成不一樣了,執行緒剩餘各位可以看下面

下面是乙個更明顯的測試,依次執行多個await,然後獲取當前執行緒的id,它們在非同步環境下,有可能是不同的,因為每次都要從池子裡拿新的執行緒!

");返回目錄

併發,同步,非同步,阻塞,非阻塞,執行緒

乙個cpu沒有真正意義的併發,兩個人同時做同樣的事情才是真正意義上的併發,只有統籌分時處理.多路同步 同步,實時處理並且活動按順序執行 非同步,乙個人合理的安排時間來做事情,分時處理,活動分段執行,非順序執行 阻塞模式,等,同步,併發,非同步都有可能會阻塞,只是機率的大小 非阻塞模式 不等 併發,併...

程序 執行緒 同步非同步 阻塞非阻塞

2015 08 19 15 23 38 週三 執行緒執行緒安全 如果你的 所在的程序中有多個執行緒在同時執行,而這些執行緒可能會同時執行這段 執行緒安全問題都是由全域性變數及靜態變數引起的 若每個執行緒中對全域性變數 靜態變數只有讀操作,而無寫操作,一般來說,這個全域性變數是執行緒安全的 若有多個執...

程序 執行緒 同步 非同步 阻塞 非阻塞

1.程序和執行緒 1 程序 process 是windows系統中的重要概念,它包含著乙個執行程式所需要的資源 乙個正在執行的應用程式在作業系統中被視為乙個程序 程序可以包含乙個或多個執行緒 程序和程序之間是相互獨立的,乙個程序無法訪問另外乙個程序的資料 2 執行緒 thread 是程序中的基本執行...