> For the complete documentation index, see [llms.txt](https://wskdsgcf.gitbook.io/mastering-go-zh-cn/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://wskdsgcf.gitbook.io/mastering-go-zh-cn/10.0/10.9.md).

# 10.9 练习

* 使用缓冲通道实现一个并发版本的 `wc(1)`。
* 接着，使用共享内存实现一个并发版本的 `wx(1)`。
* 最后，使用监视 goroutine 实现一个并发版本的 `wx(1)`。
* 修改 `workerPool.go` 的源码来保存结果到文件里。处理文件时，使用互斥锁和关键部分，或者一个监视 goroutine 来保证在磁盘上写入您的数据。
* 当 `workerPool.go` 的 `size` 全局变量为 `1` 时会发生什么？为什么？
* 修改 `workerPool.go` 的源码来实现 `wc(1)` 支持命令行功能。
* 修改 `workerPool.go` 的源码来实现 `clients` 和 `data` 缓冲通道的大小可以通过命令行参数来定义。
* 使用监视 goroutine 写一个并发版本的 `find(1)` 命令行工具。
* 修改 `simpleContext.go` 源码，把在 `f1()`, `f2()`, `f3()` 中使用的匿名函数改为一个单独的函数。这个改动的难点是什么？
* 修改 `simpleContext.go` 的源码，让 `f1()`，`f2()`，`f3()` 函数使用外部创建的 `Context` 变量而不是它们自己的。
* 修改 `useContext.go` 源码，使用 `context.WithDeadline()` 或者 `context.WithCancel()` 来代替 `context.WithTimeout()`。
* 最后，使用 `sync.Mutex` 互斥锁时间一个并发版本的 `find(1)` 命令行工具。
