Documentation for method
lock assembled from the following types:
method lock(IO::CatHandle: Bool : = False, Bool : = False --> True)
method lock(IO::Handle:Bool : = False, Bool : = False--> True)
Places an advisory lock on the file the filehandle if open for. If
X::IO::Lock if lock could not be obtained, otherwise will block until the lock can be placed. If
True will place a shared (read) lock, otherwise will place an exclusive (write) lock. On success, returns
True; fails with
X::IO::Lock if lock cannot be placed (e.g. when trying to place a shared lock on a filehandle opened in write mode or trying to place an exclusive lock on a filehandle opened in read mode).
# One program writes, the other reads, and thanks to locks either# will wait for the other to finish before proceeding to read/write# Writergiven "foo".IO.open(:w)# Readergiven "foo".IO.open
method lock(Lock::Async: --> Promise)
Returns a Promise that will be kept when the lock is available. In the case that the lock is already available, an already kept
Promise will be returned. Use
await to wait for the lock to be available in a non-blocking manner.
my = Lock::Async.new;await .lock;
Prefer to use protect instead of explicit calls to
Acquires the lock. If it is currently not available, waits for it.
my = Lock.new;.lock;
Lock is implemented using OS-provided facilities, a thread waiting for the lock will not be scheduled until the lock is available for it. Since
Lock is re-entrant, if the current thread already holds the lock, calling
lock will simply bump a recursion count.
While it's easy enough to use the
lock method, it's more difficult to correctly use
unlock. Instead, prefer to use the
protect method instead, which takes care of making sure the
unlock calls always both occur.