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

  • swipl
    • library
      • error.pl
      • apply.pl -- Apply predicates on a list
      • lists.pl
      • debug.pl -- Print debug messages and test assertions
      • broadcast.pl -- Event service
      • socket.pl
      • predicate_options.pl -- Access and analyse predicate options
      • shlib.pl -- Utility library for loading foreign objects (DLLs, shared objects)
      • option.pl
      • uid.pl -- User and group management on Unix systems
      • unix.pl -- Unix specific operations
      • syslog.pl -- Unix syslog interface
      • thread_pool.pl -- Resource bounded thread management
      • gensym.pl -- Generate unique symbols
      • settings.pl
      • arithmetic.pl -- Extensible arithmetic
      • main.pl
      • readutil.pl -- Read utilities
      • ssl.pl
      • crypto.pl -- Cryptography and authentication library
      • pldoc.pl -- Process source documentation
      • operators.pl -- Manage operators
      • pairs.pl -- Operations on key-value lists
      • prolog_source.pl -- Examine Prolog source-files
      • pengines.pl -- Pengines: Web Logic Programming Made Easy
      • record.pl -- Access compound arguments by name
      • memfile.pl
      • sgml.pl -- SGML, XML and HTML parser
      • quasi_quotations.pl -- Define Quasi Quotation syntax
      • pure_input.pl -- Pure Input from files and streams
      • time.pl -- Time and alarm library
      • uri.pl -- Process URIs
      • solution_sequences.pl -- Modify solution sequences
      • uuid.pl -- Universally Unique Identifier (UUID) Library
      • ordsets.pl -- Ordered set manipulation
      • random.pl -- Random numbers
      • base64.pl -- Base64 encoding and decoding
      • aggregate.pl -- Aggregation operators on backtrackable predicates
      • pcre.pl -- Perl compatible regular expression matching for SWI-Prolog
      • pengines_io.pl -- Provide Prolog I/O for HTML clients
      • sandbox.pl -- Sandboxed Prolog code
      • apply_macros.pl -- Goal expansion rules to avoid meta-calling
      • assoc.pl -- Binary associations
      • prolog_format.pl -- Analyse format specifications
      • yall.pl -- Lambda expressions
      • sha.pl -- SHA secure hashes
      • process.pl -- Create processes and redirect I/O
      • filesex.pl -- Extended operations on files
      • 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
      • modules.pl -- Module utility predicates
      • occurs.pl -- Finding and counting sub-terms
      • prolog_xref.pl -- Prolog cross-referencer data collection
      • prolog_colour.pl -- Prolog syntax colouring support.
      • lazy_lists.pl -- Lazy list handling
      • prolog_code.pl -- Utilities for reasoning about code
      • ugraphs.pl -- Graph manipulation library
      • xpath.pl -- Select nodes in an XML DOM
      • iostream.pl -- Utilities to deal with streams
      • doc_http.pl -- Documentation server
      • url.pl -- Analysing and constructing URL
      • www_browser.pl -- Open a URL in the users browser
      • prolog_pack.pl -- A package manager for Prolog
      • prolog_config.pl -- Provide configuration information
      • git.pl -- Run GIT commands
      • strings.pl -- String utilities
      • dif.pl -- The dif/2 constraint
      • dialect.pl -- Support multiple Prolog dialects
      • edinburgh.pl -- Some traditional Edinburgh predicates
      • ansi_term.pl -- Print decorated text to ANSI consoles
      • terms.pl -- Term manipulation
      • listing.pl -- List programs and pretty print clauses
      • persistency.pl -- Provide persistent dynamic predicates
      • pengines_sandbox.pl -- Declare Pengine interaction sandbox-safe
      • term_to_json.pl
      • prolog_stack.pl -- Examine the Prolog stack
      • prolog_clause.pl -- Get detailed source-information about a clause
      • prolog_breakpoints.pl -- Manage Prolog break-points
      • wfs.pl -- Well Founded Semantics interface
      • mallocinfo.pl -- Memory allocation details
      • chr.pl
      • sort.pl
      • dicts.pl -- Dict utilities
      • varnumbers.pl -- Utilities for numbered terms
      • nb_set.pl -- Non-backtrackable sets
      • base32.pl -- Base32 encoding and decoding
      • charsio.pl -- I/O on Lists of Character Codes
      • 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
      • rbtrees.pl -- Red black trees
      • statistics.pl -- Get information about resource usage
      • when.pl -- Conditional coroutining
      • backcomp.pl -- Backward compatibility
      • unicode.pl -- Unicode string handling
      • redis.pl -- Redis client
      • threadutil.pl -- Interactive thread utilities
      • redis_streams.pl -- Using Redis streams
      • prolog_stream.pl -- A stream with Prolog callbacks
      • streams.pl -- Manage Prolog streams
      • stomp.pl -- STOMP client.
      • rdf_parser.pl
      • rewrite_term.pl
      • xsdp_types.pl -- XML-Schema primitive types
      • rwlocks.pl -- Read/write locks
        • with_rwlock/3
        • with_rwlock/4
      • utf8.pl -- UTF-8 encoding/decoding on lists of character codes.
      • readline.pl -- GNU readline interface
      • quintus.pl -- Quintus compatibility
      • shell.pl -- Elementary shell commands
      • protobufs.pl -- Google's Protocol Buffers ("protobufs")
      • isub.pl -- isub: a string similarity measure
      • prolog_profile.pl -- Execution profiler
      • test_cover.pl -- Clause coverage analysis
      • prolog_codewalk.pl -- Prolog code walker
      • prolog_metainference.pl -- Infer meta-predicate properties
      • mqi.pl
      • optparse.pl -- command line parsing
      • make.pl -- Reload modified source files
      • crypt.pl
      • prolog_jiti.pl -- Just In Time Indexing (JITI) utilities
      • help.pl -- Text based manual
      • increval.pl -- Incremental dynamic predicate modification
      • tables.pl -- XSB interface to tables
      • intercept.pl -- Intercept and signal interface
      • paxos.pl -- A Replicated Data Store
      • thread.pl -- High level thread primitives
      • oset.pl -- Ordered set manipulation
      • sgml_write.pl -- XML/SGML writer module
      • edit.pl -- Editor interface
      • odbc.pl
      • double_metaphone.pl -- Phonetic string matching
      • table.pl
      • prolog_trace.pl -- Print access to predicates
      • check.pl -- Consistency checking
      • archive.pl -- Access several archive formats
      • zip.pl -- Access resource ZIP archives
      • explain.pl -- Describe Prolog Terms
      • pwp.pl -- Prolog Well-formed Pages
      • doc_latex.pl -- PlDoc LaTeX backend
      • prolog_history.pl -- Per-directory persistent commandline history
      • rdf.pl -- RDF/XML parser
      • hashtable.pl -- Hash tables
      • rdf_triple.pl -- Create triples from intermediate representation
      • xmlenc.pl -- XML encryption library
      • xmldsig.pl -- XML Digital signature
      • c14n2.pl -- C14n2 canonical XML documents
      • yaml.pl -- Process YAML data
      • prolog_debug.pl -- User level debugging tools
      • udp_broadcast.pl -- A UDP broadcast proxy
      • qsave.pl -- Save current program as a state or executable
      • system.pl -- System utilities
      • prolog_wrap.pl -- Wrapping predicates
      • writef.pl -- Old-style formatted write
      • editline.pl -- BSD libedit based command line editing
      • fastrw.pl -- Fast reading and writing of terms
      • prolog_autoload.pl -- Autoload all dependencies
      • rlimit.pl
      • macros.pl -- Macro expansion
      • snowball.pl -- The Snowball multi-lingual stemmer library
      • streampool.pl -- Input multiplexing
      • doc_files.pl -- Create stand-alone documentation files
      • plunit.pl -- Unit Testing
      • prolog_versions.pl -- Demand specific Prolog versions
      • files.pl
      • portray_text.pl -- Portray text
      • cgi.pl -- Read CGI parameters
      • rdf_write.pl -- Write RDF/XML from a list of triples
      • readln.pl -- Read line as list of tokens
 with_rwlock(+LockId, :Goal, +ModeSpec)
 with_rwlock(+LockId, :Goal, +ModeSpec, +Options)
Run Goal, synchronized with LockId in ModeSpec. ModeSpec is one of read, write, read(Priority) or write(Priority). The default read priority is 100 and the default write priority is 200. These values prioritize writers over readers. Goal may start if
  • If there is no goal waiting with higher priority and
    • It is a read goal and no write goal is running or
    • It is a write goal and no other goal is running.

If Goal may not start immediately the thread waits using thread_wait/2. The Options timeout and deadline are passed to thread_wait/2. If the time limit is exceeded an exception is raised.

Read/write locks are widely critized for their poor behaviour on several workloads. They perform well in scenarios where read operations take long, and write operations are relatively fast and occur only occasionally. Transactions, as implemented by transaction/1,2 are often a better alternative.

This predicate uses a normal mutex and a flag with the same name. See with_mutex/2 and flag/3. Neither the mutex nor the flag should be used directly.

throws
- time_limit_exceeded(rwlock) if a timeout or deadline is specified and this is exceeded.
bug
- The current implementation is written in Prolog and comes with significant overhead. It is intended to synchronize slow operations.