lisp threading example
Today I wanted to experiment with threads in lisp (sbcl, in particular).
Here is a trivial example of how to access a shared resource (a closure, keeping a list of integers), from a set of *nt* threads.
(use-package :sb-thread)
;; number of threads
(defparameter *nt* 10)
;; threads
(defvar *threads* '())
;; mutex to use with shared resource accessed by the threads
(defvar *a-mutex* (make-mutex :name "acc-lock"))
;; shared closure accessed by the threads
(let ((x '()))
(defun acc (v)
(with-mutex (*a-mutex*)
(push v x)))
(defun get-acc ()
x))
;; print the shared resource
(print (get-acc))
;; wait for all the threads to return
(mapcar #'join-thread
;; run the threads
(loop :for i :below *nt*
;; bind i to x so it is local to the thread
:collect (let ((x i))
(make-thread #'(lambda ()
;; body of the thread
(sleep (random 2))
(acc x))
:name x))))
;; print the shared resource
(print (get-acc))
It can't get much simpler than that...