Parallel programming has been around for decades, though before the advent of
multi-core processors, it was more of an esoteric discipline. Now that numerous
programmers have tripped over the common stumbling blocks, you can avoid
stumbling by understanding the common problems before designing a parallel
program. Many of the problems arise from the overall design of the basic
algorithms, and cannot be easily patched later. This article surveys some of these
common algorithmic problems, their symptoms, and ways to circumvent them.