Mutexes are used for controlling access to a shared resource. One thread is allowed to hold the mutex, others which attempt to take it will be made to wait until it's free. Threads are woken in the order that they go to sleep.
There isn't a timeout on mutex acquisition, but the usual WITH-TIMEOUT macro (which throws a TIMEOUT condition after n seconds) can be used if you want a bounded wait.
(defpackage :demo (:use "CL" "SB-THREAD" "SB-EXT")) (in-package :demo) (defvar *a-mutex* (make-mutex :name "my lock")) (defun thread-fn () (format t "Thread ~A running ~%" *current-thread*) (with-mutex (*a-mutex*) (format t "Thread ~A got the lock~%" *current-thread*) (sleep (random 5))) (format t "Thread ~A dropped lock, dying now~%" *current-thread*)) (make-thread #'thread-fn) (make-thread #'thread-fn)
get-mutexto assign a
mutexto another thread then the current one is not recommended, and liable to be deprecated.
get-mutexis not interrupt safe. The correct way to call it is:(WITHOUT-INTERRUPTS ... (ALLOW-WITH-INTERRUPTS (GET-MUTEX ...)) ...)
without-interruptsis necessary to avoid an interrupt unwinding the call while the mutex is in an inconsistent state while
allow-with-interruptsallows the call to be interrupted from sleep.
It is recommended that you use
with-mutexinstead of calling
release-mutexis not interrupt safe: interrupts should be disabled around calls to it.
If the current thread is not the owner of the mutex then it silently returns without doing anything (if
if-not-owneris :PUNT), signals a
if-not-owneris :WARN), or releases the mutex anyway (if