More sophisticated approaches have been proposed, supplying the users with tools for dealing with parallel computations at a higher level of abstraction. This goes from specialized libraries supplying a uniform set of communication primitives to hide the details of the computing environment (e.g., PVM [101] and Linda [39]) to sophisticated languages like PCN [35].
Explicit parallelism has various advantages and disadvantages. The main advantage is its considerable flexibility, which allows to code a wide variety of patterns of execution, giving a considerable freedom in the choice of what should be run in parallel and how. On the other hand, the management of the parallelism--a very complex task--is left to the programmer. Activities like detecting the components of the parallel execution and guaranteeing a proper synchronization (e.g., absence of race conditions) can be more or less complex depending on the specific application.