This is just a quick plug for two articles that I wrote for MSDN magazine a few months back. They are
The first article, as its title suggests, is what I think every programmer should know about Multithreaded programming. I know from my own ramp up on multi-threading issues that while the principles of concurrent programming are actually relatively simple, the ramifications of those principles are VERY subtle. The upshot is that if you write multi-threaded apps (and it turns out that EVERY managed app that uses finalizers is multi-threaded), you should take a look at the first article (either you will already know it (which is good), or you will be glad you learned it.
The second article is really trying to warn you way from what is often called ‘lock free’ programming. If concurrent programming is subtle, concurrent lock free programming is 10 times as subtle. The article is mostly an exposition of SOME of the subtleties’, and hopefully that will be enough to scare you away from using lock free techniques in all but the most constrained circumstances.
Enjoy the articles.