zl程序教程

您现在的位置是:首页 >  其它

当前栏目

使用纤程简化枚举器5:组合

组合 枚举 简化 使用
2023-09-14 09:10:43 时间

另一个关于枚举的高级玩法是组合,也就是说,一个枚举实际上是组合了其他多个枚举的结果。(在面向对象编程中,大家都对派生比较熟悉,实际上,组合也是面向对象编程中一个十分强大的概念,在之前关于上下文菜单的文章中我们就看到过组合,你应该还有点印象吧?)

在生产者驱动的枚举实现转给中,可以通过一个接一个地调用两个枚举函数来实现组合功能。 在消费者驱动的枚举器中,您可以通过将两个枚举器包装在一个大枚举器中来实现组合,然后根据当前处于活动状态的枚举器在两者之间进行选择。

基于纤程的枚举器的行为,更像是一个消费者驱动的枚举器,同样,状态管理更容易。

让我们编写一个组合枚举器,枚举C盘根目录中的所有内容(无子目录),以及当前目录中的所有内容(包括子目录),如下图所示:

代码解析

我们的组合枚举实现上有些复杂,因为我们的 FilteredEnumerator 最后会输出一个 FEF_LEAVEDIR,但我们想禁止它,所以我们必须检查它并对他进行处理。

在枚举器生成一个一维列表的情况下,只需将两个枚举器一个接一个地转发就可以了。 类似于下图:

你可以在过去几天一直在玩的程序中使用这个 CompositeEnumerator。 只需将 main 中创建枚举器的代码行进行如下的修改:
CompositeEnumerator e;

练习题1:为什么总数这么大?
练习题2:在程序中涉及到多少个纤程?
练习题3:画出一个图表来说明控制在这个程序中的不同纤程之间是如何流动的。

当你对纤程的强大功能感到兴奋之前,请考虑如下几个要点:
> 将线程转换为纤程时,需要在过程中的所有组件之间进行协调,以便它只转换一次并保持转换直到每个人都完成。 这意味着如果你正在编写一个将进入其他进程的插件,你可能应该避免使用纤程,因为你不知道该进程中的其他组件将如何处理纤程。
> 纤程并不能完全解决每个连接一个线程的问题。 它们确实减少了上下文切换,但内存占用仍然会将限制为每个进程 2000 根纤程(假设用户模式地址空间为 2GB),因为每根纤程都有一个堆栈,默认为 1MB。

总结

好了,我想关于纤程的所有讲述就先到了这里。
感谢观看,希望这个主题对你来说没有那么枯燥。
下次我们再说说别的。

 

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Using fibers to simplify enumerators, part 5: Composition》