A Thread pool implemented in Common Lisp
The thread pool consists of a fixed number of worker threads and a job queue. The worker threads are picking jobs from the queue and execute them.
Install (downloads and installs all dependencies)
Create a thread pool with 5 worker threads
(defparameter *threadpool* (cl-threadpool:make-threadpool 5))
Start the pool
Add a job
(cl-threadpool:add-job *threadpool* (lambda () (sleep 5)))
Stop the pool
More detailed documentation is provided by the documentation strings of the functions.
make-threadpool (size &key (name nil) (max-queue-size nil) (resignal-job-conditions nil))
- size Number of worker threads
- max-queue-size Maximum size of job queue
- name Name of the pool
- resignal-job-conditions if true then conditions signalled by a job will be resignalled as errors.
add-job (pool job)
See also threadpool-error-queue-capacity-exceeded
- pool a threadpool
- job a function with zero arguments that will be executed by a worker thread of the pool
stop (pool &key (force-destroy-timeout-seconds nil))
Stops the thread pool. The function returns when all worker threads are no longer alive. A worker thread terminates when no job is available and the thread pool is stopping.
- force-destroy-timeout-seconds An optional timeout in seconds after which all still alive pool threads will be destroyed.
threadpoolp (obj) => generalized boolean
Returns t if the given object represents a thread pool.
worker-thread-p (pool) => generalized boolean
Returns t if the current thread is a worker thread of the pool.
The default condition that is signalled by the pool in any case of pool thread usage related errors.
This condition is signalled when the capacity of the job queue is being exceeded when adding a job.
The thread pool uses the Verbose framework for logging.
Disable logging of the cl-threadpool package
(setf (v:repl-categories) (v:remove-repl-category (list :cl-threadpool)))
Set logging level (globally)
(setf (v:repl-level) :error)
Running the tests
The tests are using the lisp-unit framework. The system definition file is cl-threadpool-test.asd.
Run all tests
(asdf:load-system "cl-threadpool-test") (in-package :cl-threadpool-test) (run-tests)
Run a specific test
(asdf:load-system "cl-threadpool-test") (in-package :cl-threadpool-test) (run-tests '(worker-thread-p-test-1))
The thread pool has been tested on the following operating systems and Lisp implementations:
- MacOS 10.11.3 (El Capitan): SBCL, CCL, ABCL (Java 1.8)
- Windows 10: SBCL, ABCL (Java 1.8)
/script directory contains a couple of shell scripts for running the test suite.
On any questions/bugs/feature requests create an issue or contact me: Oliver