This was the final chapter, dedicated to multithreading, which put a finishing touch on a story line that started in Chapter 5, Getting Started with the Parallel World. I started by describing all the bad things that can happen when writing parallel code, then spent one chapter showing the cumbersome TThread, which makes multithreaded code such an unnecessary pain, and then in this chapter I finally moved on to the nice parts of the puzzle—tasks and patterns.
The chapter opened with a discussion of tasks and patterns—what they are and how they can be used to simplify multithreaded programming. For a bonus, I threw in a short treatise about variable capturing, which focused only on one problematic part—the capturing of a loop variable.
Then we looked at how we can use tasks to split a loop into multiple parallel loops. We saw that there's quite...