`val synchronize : ?lock:Stdlib.Mutex.t -> ('a -> 'b) -> 'a -> 'b`

Protect a function.

`synchronize f` returns a new function `f'` with the same behavior as `f` but such that concurrent calls to `f'` are queued if necessary to avoid races.

`synchronize ~lock:l f` behaves as `synchronize f` but uses a user-specified lock `l`, which may be useful to share a lock between several function. This is necessary in particular when the lock is specific to a data structure rather than to a function.

In either case, the lock is acquired when entering the function and released when the function call ends, whether this is due to normal termination or to some exception being raised.

`val make : unit -> BatConcurrent.lock`

Create a new abstract lock based on Mutexes.