[ Obsolete | Reference Manual | Alphabetic Index ]
mutex(+MutexId, +Goal)
Equivalent to once(Goal) but with mutual exclusion among parallel workers.
- MutexId
- Atom.
- Goal
- Atom or compound term.
This built-in predicate is obsolete!
Description
   This built-in can be used in parallel programs to implement mutual
   exclusion between parallel workers.  A Goal that is called via mutex/2
   can be sure that no parallel worker is executing at the same time any
   goal that is protected by a mutex/2 with the same MutexId.
   Note that in a side effect free program there is no need ever to worry
   about mutual exclusion.  Only when side effects are involved (e.g.
   read/1,2 and write/1,2, assert/1, setval/2, record/2 etc.)  it may be
   necessary to acquire exclusive access to the common resource by using
   mutex/2.
Modes and Determinism
Modules
This predicate is sensitive to its module context (tool predicate, see @/2).
Fail Conditions
Fails if Goal fails
Exceptions
- (4) instantiation fault 
- Goal is not instantiated.
- (5) type error 
- Goal is not an atom or a compound term.
Examples
    :- mutex_init(my_lock).
    atomic_write_list(List) :-
        % make sure the list is printed in one chunk
        mutex(my_lock, write_list(List)).
    write_list([]) :- nl.
    write_list([X|Xs]) :- writeln(X), write_list(Xs).
    [eclipse]: generate_lists_in_parallel(L),
               atomic_write_list(L), fail.
See Also
mutex_init / 1, once / 1