In this chapter, we studied three well-known concurrency problems that show up consistently when working with non-trivial problems. Producer-consumer implementations have uses in data processing pipelines, crawlers, device interactions, network communications, and more. The dining philosophers problem is a good demonstration of critical sections that require multiple mutexes. Finally, rate-limiting has applications in ensuring the quality of service, limiting resource utilization, and API accounting.
In the next chapter, we will start looking at more realistic examples of concurrent programming, in particular, worker pools, concurrent data pipelines, and fan-in/fan-out.