In 2013 and 2014 I ran three-day C++ courses in Kraków for programmers who had to write concurrent and real-time code. Most of each day was spent on short examples that people ran and changed themselves, followed by exercises. On the first morning everybody cloned the repository. The notes started with setting up the virtual machine, the proxy and git, so that nobody lost time on the environment.
Threads in C++ was about how to write multithreaded code that is correct. We went through creating threads and passing arguments to them, dangling references, joining safely with RAII, thread groups, thread-specific storage, interrupting threads and dealing with exceptions thrown in one of them. Among the exercises were a multithreaded sum and computing π in parallel. Materials.
Real-time C++ on Linux went further: types of mutexes, producer-consumer and thread-safe queues, thread priorities with Boost and POSIX. On the Linux side we looked at scheduling policies and priorities (chrt), CPU affinity, measuring context switches, writing a character device, and how to let an ordinary user run real-time threads with rtprio limits for a realtime group. Part 1, part 2.