天天看點

使用纖程簡化枚舉器5:組合

另一個關于枚舉的進階玩法是組合,也就是說,一個枚舉實際上是組合了其他多個枚舉的結果。(在面向對象程式設計中,大家都對派生比較熟悉,實際上,組合也是面向對象程式設計中一個十分強大的概念,在之前關于上下文菜單的文章中我們就看到過組合,你應該還有點印象吧?)

在生産者驅動的枚舉實作轉給中,可以通過一個接一個地調用兩個枚舉函數來實作組合功能。 在消費者驅動的枚舉器中,您可以通過将兩個枚舉器包裝在一個大枚舉器中來實作組合,然後根據目前處于活動狀态的枚舉器在兩者之間進行選擇。

基于纖程的枚舉器的行為,更像是一個消費者驅動的枚舉器,同樣,狀态管理更容易。

讓我們編寫一個組合枚舉器,枚舉C槽根目錄中的所有内容(無子目錄),以及目前目錄中的所有内容(包括子目錄),如下圖所示:

使用纖程簡化枚舉器5:組合

代碼解析

我們的組合枚舉實作上有些複雜,因為我們的 FilteredEnumerator 最後會輸出一個 FEF_LEAVEDIR,但我們想禁止它,是以我們必須檢查它并對他進行處理。

在枚舉器生成一個一維清單的情況下,隻需将兩個枚舉器一個接一個地轉發就可以了。 類似于下圖:

使用纖程簡化枚舉器5:組合

你可以在過去幾天一直在玩的程式中使用這個 CompositeEnumerator。 隻需将 main 中建立枚舉器的代碼行進行如下的修改:

CompositeEnumerator e;

練習題1:為什麼總數這麼大?

練習題2:在程式中涉及到多少個纖程?

練習題3:畫出一個圖表來說明控制在這個程式中的不同纖程之間是如何流動的。

當你對纖程的強大功能感到興奮之前,請考慮如下幾個要點:

> 将線程轉換為纖程時,需要在過程中的所有元件之間進行協調,以便它隻轉換一次并保持轉換直到每個人都完成。 這意味着如果你正在編寫一個将進入其他程序的插件,你可能應該避免使用纖程,因為你不知道該程序中的其他元件将如何處理纖程。

> 纖程并不能完全解決每個連接配接一個線程的問題。 它們确實減少了上下文切換,但記憶體占用仍然會将限制為每個程序 2000 根纖程(假設使用者模式位址空間為 2GB),因為每根纖程都有一個堆棧,預設為 1MB。

總結

好了,我想關于纖程的所有講述就先到了這裡。

感謝觀看,希望這個主題對你來說沒有那麼枯燥。

下次我們再說說别的。

最後

繼續閱讀