A collection of design patterns & strategies for structuring concurrent programs.
Message passing is the way to go.
Pipelines can be rippin fast but are not suitable for every problem
The popular approach for GUI applications.
Use locks and shared memory to shoot yourself in the foot in parallel.