Source: https://info.usherbrooke.ca/GabrielGirard/cours/ift-630-processus-concurrents-et-parallelisme/documents/l3-se-cours-05-v1-0.pdf