DON'T MULTITHREAD EVERYTHING!!!
Locks, mutexes, etc., have existed for over 40 years to deal with EXACTLY these problems; some systems of the past, the processors did not even have to run at the same speed. Wire temperature causing bugs? No! That's poor programming, you CANNOT rely on threads completing in any particular order or length of time, even if one is very short-running and the other very long -- if you do your code is buggy, period.
Of course, these boffins in the article know this -- they seem to be developing tools to test for and find these types of faults. Which I actually think is a good thing. But really it's more important to either 1) Know how to write multithreaded code. Or 2) DON'T WRITE IT!!
There are tasks that parallelize naturally -- particularly the general "crunching through a big array of numbers" type of problems. However, for these, knowing where your lock(s) have to go is a fairly natural process. Using locks is easy, but really, it's better to start with lower-performing code until you prove you DON'T need some extra locks than to leave them out and have random faults in your code. Seriously. If it's really hard to tell what data structures need locks, please PLEASE consider option 2 and DON'T thread it just for fun! If I buy a quad core, it's NOT so someone can write an extra-bloated multithreaded word processor (or whatever single app) that kills all 4 cores -- it's so I can run a bunch of apps at the same time. Of course I don't think I'll have this problem -- I'm running Ubuntu and Gentoo, the whole "thread everything!" view seems to be a Windows thing from what I can tell.