/usr/lib/swipl/library/thread.pl
AllApplicationManualNameSummaryHelp

  • swipl
    • library
      • settings.pl -- Setting management
      • error.pl -- Error generating support
      • broadcast.pl -- Event service
      • debug.pl -- Print debug messages and test assertions
      • lists.pl -- List Manipulation
      • pairs.pl -- Operations on key-value lists
      • option.pl -- Option list processing
      • arithmetic.pl -- Extensible arithmetic
      • pldoc.pl -- Process source documentation
      • apply.pl -- Apply predicates on a list
      • operators.pl -- Manage operators
      • prolog_source.pl -- Examine Prolog source-files
      • pengines.pl -- Pengines: Web Logic Programming Made Easy
      • time.pl -- Time and alarm library
      • shlib.pl -- Utility library for loading foreign objects (DLLs, shared objects)
      • zip.pl -- Access resource ZIP archives
      • uri.pl -- Process URIs
      • socket.pl -- Network socket (TCP and UDP) library
      • thread_pool.pl -- Resource bounded thread management
      • rbtrees.pl -- Red black trees
      • gensym.pl -- Generate unique symbols
      • readutil.pl -- Read utilities
      • url.pl -- Analysing and constructing URL
      • utf8.pl -- UTF-8 encoding/decoding on lists of character codes.
      • memfile.pl
      • sgml.pl -- SGML, XML and HTML parser
      • iostream.pl -- Utilities to deal with streams
      • dialect.pl -- Support multiple Prolog dialects
      • quasi_quotations.pl -- Define Quasi Quotation syntax
      • pure_input.pl -- Pure Input from files and streams
      • base64.pl -- Base64 encoding and decoding
      • aggregate.pl -- Aggregation operators on backtrackable predicates
      • ordsets.pl -- Ordered set manipulation
      • oset.pl -- Ordered set manipulation
      • record.pl -- Access compound arguments by name
      • filesex.pl -- Extended operations on files
      • charsio.pl -- I/O on Lists of Character Codes
      • sandbox.pl -- Sandboxed Prolog code
      • assoc.pl -- Binary associations
      • prolog_format.pl -- Analyse format specifications
      • when.pl -- Conditional coroutining
      • modules.pl -- Module utility predicates
      • term_to_json.pl
      • uuid.pl -- Universally Unique Identifier (UUID) Library
      • ssl.pl -- Secure Socket Layer (SSL) library
      • crypto.pl -- Cryptography and authentication library
      • solution_sequences.pl -- Modify solution sequences
      • nb_set.pl -- Non-backtrackable sets
      • terms.pl -- Term manipulation
      • apply_macros.pl -- Goal expansion rules to avoid meta-calling
      • sha.pl -- SHA secure hashes
      • random.pl -- Random numbers
      • pcre.pl -- Perl compatible regular expression matching for SWI-Prolog
      • pengines_io.pl -- Provide Prolog I/O for HTML clients
      • listing.pl -- List programs and pretty print clauses
      • ansi_term.pl -- Print decorated text to ANSI consoles
      • prolog_clause.pl -- Get detailed source-information about a clause
      • occurs.pl -- Finding and counting sub-terms
      • yall.pl -- Lambda expressions
      • prolog_stream.pl -- A stream with Prolog callbacks
      • process.pl -- Create processes and redirect I/O
      • zlib.pl -- Zlib wrapper for SWI-Prolog
      • bdb.pl -- Berkeley DB interface
      • hash_stream.pl -- Maintain a hash on a stream
      • md5.pl -- MD5 hashes
      • porter_stem.pl
      • csv.pl -- Process CSV (Comma-Separated Values) data
      • pprint.pl -- Pretty Print Prolog terms
      • atom.pl -- Operations on atoms
      • ctypes.pl -- Character code classification
      • prolog_xref.pl -- Prolog cross-referencer data collection
      • prolog_colour.pl -- Prolog syntax colouring support.
      • predicate_options.pl -- Access and analyse predicate options
      • lazy_lists.pl -- Lazy list handling
      • ugraphs.pl -- Graph manipulation library
      • xpath.pl -- Select nodes in an XML DOM
      • doc_http.pl -- Documentation server
      • www_browser.pl -- Open a URL in the users browser
      • prolog_pack.pl -- A package manager for Prolog
      • git.pl -- Run GIT commands
      • crypt.pl
      • persistency.pl -- Provide persistent dynamic predicates
      • edinburgh.pl -- Some traditional Edinburgh predicates
      • prolog_breakpoints.pl -- Manage Prolog break-points
      • unix.pl -- Unix specific operations
      • mallocinfo.pl -- Memory allocation details
      • chr.pl
      • dicts.pl -- Dict utilities
      • dif.pl -- The dif/2 constraint
      • varnumbers.pl -- Utilities for numbered terms
      • shell.pl -- Elementary shell commands
      • uid.pl -- User and group management on Unix systems
      • syslog.pl -- Unix syslog interface
      • main.pl -- Provide entry point for scripts
      • sort.pl
      • doc_files.pl -- Create stand-alone documentation files
      • base32.pl -- Base32 encoding and decoding
      • backcomp.pl -- Backward compatibility
      • system.pl -- System utilities
      • codesio.pl -- I/O on Lists of Character Codes
      • coinduction.pl -- Co-Logic Programming
      • date.pl -- Process dates and times
      • heaps.pl -- heaps/priority queues
      • statistics.pl -- Get information about resource usage
      • sgml_write.pl -- XML/SGML writer module
      • c14n2.pl -- C14n2 canonical XML documents
      • quintus.pl -- Quintus compatibility
      • make.pl -- Reload modified source files
      • check.pl -- Consistency checking
      • prolog_codewalk.pl -- Prolog code walker
      • prolog_metainference.pl -- Infer meta-predicate properties
      • archive.pl -- Access several archive formats
      • explain.pl -- Describe Prolog Terms
      • writef.pl -- Old-style formatted write
      • rdf_write.pl -- Write RDF/XML from a list of triples
      • rdf.pl
      • rdf_parser.pl
      • rewrite.pl
      • rdf_triple.pl -- Create triples from intermediate representation
      • xsdp_types.pl -- XML-Schema primitive types
      • thread.pl -- High level thread primitives
        • concurrent/3
        • concurrent_maplist/2
        • concurrent_maplist/3
        • concurrent_maplist/4
        • first_solution/3
      • table.pl
      • pwp.pl -- Prolog Well-formed Pages
      • readline.pl -- GNU readline interface
      • threadutil.pl -- Interactive thread utilities
      • unicode.pl -- Unicode string handling
      • isub.pl -- isub: a string similarity measure
      • paxos.pl -- A Replicated Data Store
      • doc_latex.pl -- PlDoc LaTeX backend
      • prolog_autoload.pl -- Autoload all dependencies
      • editline.pl -- BSD libedit based command line editing
      • console_input.pl
      • plunit.pl -- Unit Testing
      • optparse.pl -- command line parsing
      • edit.pl -- Editor interface
      • udp_broadcast.pl -- A UDP broadcast proxy
      • snowball.pl -- The Snowball multi-lingual stemmer library
      • odbc.pl
      • prolog_history.pl -- Per-directory persistent commandline history
      • prolog_config.pl -- Provide configuration information
      • double_metaphone.pl -- Phonetic string matching
      • test_cover.pl -- Clause cover analysis
      • protobufs.pl -- Google's Protocol Buffers
      • streampool.pl -- Input multiplexing
      • cgi.pl -- Read CGI parameters
      • qsave.pl -- Save current program as a state or executable
      • files.pl
      • rlimit.pl
      • help.pl -- Text based manual
      • xmldsig.pl -- XML Digital signature
      • xmlenc.pl -- XML encryption library
      • prolog_stack.pl -- Examine the Prolog stack
 concurrent(+N, :Goals, Options) is semidet
Run Goals in parallel using N threads. This call blocks until all work has been done. The Goals must be independent. They should not communicate using shared variables or any form of global data. All Goals must be thread-safe.

Execution succeeds if all goals have succeeded. If one goal fails or throws an exception, other workers are abandoned as soon as possible and the entire computation fails or re-throws the exception. Note that if multiple goals fail or raise an error it is not defined which error or failure is reported.

On successful completion, variable bindings are returned. Note however that threads have independent stacks and therefore the goal is copied to the worker thread and the result is copied back to the caller of concurrent/3.

Choosing the right number of threads is not always obvious. Here are some scenarios:

  • If the goals are CPU intensive and normally all succeeding, typically the number of CPUs is the optimal number of threads. Less does not use all CPUs, more wastes time in context switches and also uses more memory.
  • If the tasks are I/O bound the number of threads is typically higher than the number of CPUs.
  • If one or more of the goals may fail or produce an error, using a higher number of threads may find this earlier.
Arguments:
N- Number of worker-threads to create. Using 1, no threads are created. If N is larger than the number of Goals we create exactly as many threads as there are Goals.
Goals- List of callable terms.
Options- Passed to thread_create/3 for creating the workers. Only options changing the stack-sizes can be used. In particular, do not pass the detached or alias options.
See also
- In many cases, concurrent_maplist/2 and friends is easier to program and is tractable to program analysis.