Summary
In this chapter, we looked at how to pass data between threads in a safe manner as part of a fairly complex scheduler implementation. We also looked at the resulting asynchronous processing of the said scheduler, and considered some potential alternatives and optimizations for passing data between threads.
At this point, you should be able to safely pass data between threads, as well as synchronize access to other shared resources.
In the next chapter, we will look at native C++ threading and the primitives API.