OS THREADS! TONS OF OVERHEAD! DON'T USE UNLESS YOU KNOW WHAT YOU'RE DOING
At least there are tests now.
This library implements cooperative multithreading using whatever threads Lisp implementation has. In most of the cases that would be OS threads. Pretty much the only thing it does is making sure that exactly one thread is running at any given time, and that no thread is preempted arbitrarily. The latter may still happen by threads not managed by cl-cooperative.
Currently supported SBCL and CCL on Linux 64. Should work on other OSes too. Does work on ECL master too, but not on the latest release (16.1.3, 2016-12-19)
MAKE-POOL size &key scheduler
- Creates a cooperative thread pool
DESTROY-POOL pool
- Cleans up the thread pool
WITH-POOL (var size) &body body
- Run body
with a thread pool of size size
in var
WAKEUP pool
- Wakeup one job from the pool
WAKEUP-ALL pool
- Wakeup all jobs in the pool once
WAKEUP-UNTIL-RESULT pool job
- WAKEUP
until job
finishes running
and return its result
There's one existing scheduler which is round-robin-scheduler
. It
simply runs each thread in order. A scheduler is any object that the
following generic specializes on:
NEXT-THREAD scheduler active-threads
- return the next thread to be
run. active-threads
is a list of threads that have something to do.
All of these functions/macros can appear inside cooperative threads. In
addition, RUN
can be called from any thread if passed the optional parameter
pool
.
RUN (&optional pool) body
- Plan starting a new job in pool
(the same pool
as the current thread's by default).
YIELD
- Yield for a bit to allow other jobs to run
PAUSE seconds
- Yield for a number of seconds. Can be a fraction.
WAIT job
- Yield until job
finishes. Return its result
PARALLEL () body
- Yield until body
finishes in parallel, then
return its result. body
should only read/write the thread that
waits on it unless you want to deal with thread synchronization.