This is a primer on what I would consider (and probably others) is an advanced topic. Not because it's hard to wrap your head around, but because it's hard to do effectively. It's like the board game Go: the concepts are easy enough, but boy howdy do you need to really get your head around the game to play at a pro level. Before I go further though, I want to lay out some things that this primer is and is not.
This primer is to gloss over the fundamentals of multithreaded programming and the issues that happen
This will not teach you how to code multi-threaded programs. I will have examples, but that's about it.
This will not teach you how to take your single-threaded program and turn it into a multi-threaded one.
The basics: What are threads?
How do you create threads?
But if creating multiple threads is that easy, why is multithreading "hard"?
What makes multithreading hard then?
Example time! A case of the bank screwing you (okay, it's really bad programming screwing you)
What issues are there in multithreaded programming?
How do you resolve multithreading issues?
So there you have it! A primer on the wonders of programming with multiple threads. In case you're wondering, the examples were done in Python 2.7. So you can actually run this by yourself if you want.