Paper: Pjotr Prins, Dominique Belhachemi, Steffen Möller and Geert Smant Scalable Computing for Evolutionary Genomics Methods in Molecular Biology, 2012, Volume 856, Part 5, 529-545, DOI: 10.1007/978-1-61779-585-5_22 Highlights: p. 531 "Typically, parallel programming implies complicated data and control flow; causes dead locks, where depending threads wait for each other forever; and causes race conditions, where threads go into eternal loops." This is simply not true with 'message passing'. With message passing, the source code contain no lock at all. Usually, you only need 3 functions to pass messages: send(), probe(), and receive(). send() => sends a message to a destination probe() => probes a message from a source, if any receive() => receives a message Also, race conditions are not about eternal loops at all. A race can usually occur when a given bug is triggered depending on concurrent completion of at least two parallel events.