SWI-Prolog multithreading is based on standard C-language
multithreading support. It is not like ParLog or other parallel
implementations of the Prolog language. Prolog threads have their own
stacks and only share the Prolog heap: predicates, records,
flags and other global non-backtrackable data. SWI-Prolog thread support
is designed with the following goals in mind.
- Multi-threaded server applications
Today's computing services often focus on (internet) server
applications. Such applications often have need for communication
between services and/or fast non-blocking service to multiple concurrent
clients. The shared heap provides fast communication, and thread
creation is relatively cheap.98On
an Intel i7-2600K, running Ubuntu Linux 12.04, SWI-Prolog 6.2 creates
and joins 32,000 threads per second elapsed time.
- Interactive applications
Interactive applications often need to perform extensive computation. If
such computations are executed in a new thread, the main thread can
process events and allow the user to cancel the ongoing computation.
User interfaces can also use multiple threads, each thread dealing with
input from a distinct group of windows. See also section
8.8.
- Natural integration with foreign code
Each Prolog thread runs in a native thread of the operating system,
automatically making them cooperate with MT-safe foreign-code.
In addition, any foreign thread can create its own Prolog engine for
dealing with calling Prolog from C-code.
SWI-Prolog multithreading is based on the POSIX thread standard
Butenhof,
1997 used on most popular systems except for MS-Windows. On
Windows it uses the
pthread-win32
emulation of POSIX threads mixed with the Windows native API for
smoother and faster operation.
Section Index