併發系列64章 非同步程式設計三 第四章

2022-03-02 10:33:05 字數 1118 閱讀 8821

續寫第三章,結束掉一些例子。

這是什麼意思呢?

是這樣的,在預設情況下,乙個async 方法在被await呼叫恢復的時候呢,會在原來的上下文中執行。

啥上下文?那麼什麼是上下文呢?在我們以前做語文的時候,請參考上下文然後怎麼怎麼的。

這個上下文,其實就是狀態。比如說我看一篇文章,看到了第三句,說的是"他輕輕的走了"。那麼這個他是誰?

那麼我們結合第一句,"遠遠的他來了,往近一瞅,他是小明。" 那麼他就是小明。前面的上下文就是狀態。

每乙個async都是一篇文章,都有上下文狀態,當切換await的時候,還有繼續往下看,那麼就要切換上下文。

那麼async 這個狀態是啥?

從使用async修飾符修飾的方法的il**可以得出乙個結論:

在debug下,針對async方法,生成的是乙個class狀態機

在release下,針對async方法,生成的是乙個struct狀態機

這個上下文就是狀態機。

那麼這個狀態機是啥?為了避免我寫第五章還是非同步程式設計,在此只做簡單介紹。

1.每個async 都有乙個狀態機,狀態機控制著async方法的執行。

2.狀態機的狀態為:-1:初始化;-2:方法體執行結束;1:第乙個await;2:第二個await是否完成。

具體這個狀態機丟棄了,有什麼***呢?

請用ilspy 反編譯檢視,涉及到原理。

我在後續中,我會寫一章反編譯來解釋await 和 async 的原理,僅僅是個人理解。

首先說一下為什麼不推薦使用async 返回void呢?

這就有乙個問題,如果我們做地鐵的時候,總部不知道地鐵跑到**了,這是否是乙個問題?因為不返回task,那麼到底啥情況呢?

但是void 有必須存在,例如命令式的非同步事件,因為沒有返回task意義何在。

什麼是命令式的?

比如說winfrom的非同步事件,我點選了乙個按鈕。

這種就是命令式的。我只是觸發了點選按鈕這個事件,這個事件呼叫我們的程式。至於點選之後發生什麼,沒有必要知道。

那麼如何測試async void 呢?

請參考:

避免-async-void-單元測試

這裡面介紹了,我就不囉嗦了。

下一章 並行程式設計。

第四章 程式設計

選擇語言的原則 最少的工作量原則 最少技巧性原則 最少錯誤原則 最少維護原則 減少記憶原則 總原則 先求正確後求快 先求清晰後求快 求快不忘保持程式正確性 保持程式整潔以求快 不要因效率而犧牲清晰 好程式標準 易於測試和除錯 易於維護 易於修改 設計簡單 高效率結構化程式設計主要包括兩方面 在編寫程...

c 併發程式設計實戰 第四章

bool flag std mutex m void wait for flag 這個迴圈中,在休眠前 函式對互斥量進行解鎖 解鎖後,其他執行緒可以上鎖,執行一些操作,所以另外的執行緒就有機會獲取鎖並設定標識 並且在休眠結束後再對互斥量進行上鎖。c 多執行緒程式設計中通常會對共享的資料進行寫保護,以...

程式設計珠璣第四章

正文裡面涉及到程式設計方法學的內容。不再細述 1 加及條件是0 l u n 1 2 這個函式可以寫成如下形式 int bs int a,int begin,int end,int v if e a end e v return e a return 1 再給一段測試 include include ...