A quick reply off the top of my head for you stvrish. In parallel programming on multicore systems you need to ensure two things:
1. Liveness - that the various processes in your code is actually going to execute *enough* to guarantee throughput, and
2. Safety - that they wont step on each other, ie. race conditions and deadlock.
Google something like "liveness and safety in concurrent systems" and you'll get lots on these topics.
These can be hard to ensure manually - in languages like C++ and Java you can use thread libraries etc. but that's going to seriously cramp your style.
Instead, I would recommend using/learning a language that automatically splits things up across the processes for you.
Erlang, Clojure, Haskell .. to name a few.
It's a very relevant question actually. Compilers/interpretors of these languages do an awesome job of ensuring safety and liveness, well worth the pain of learning, and multicore programming will be a big chunk of the dev market. Intel have an 80 core CPU now..expect hundreds of cores soon.
cheers,
LK