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.