With a bit of manual reading, anyone can learn how to create a program that has more than one thread of execution. This breaks down, very rapidly, however, as the inter-dependencies inside the program start to burden you down, to the point where you get race bugs that are close to impossible to find. Fixing those typically involve using the various locking mechanisms. The result is, more often than not, a program that both works much slower than the number of threads and processors would suggest it should, AND at the same time still has race conditions.
This lecture will try to give rules relating to how to construct your program to begin with so that it will provide high performance, be maintainable (for some definition of maintainable), and be bug efficient. In other words, this lecture is about learning to think "multi-threaded". In fact, efficient enough multi-threaded design do not even need to have more than one thread of execution......
Lecture slides in OpenDocument Presentation.