/usr/lib/swipl/library/rwlocks.pl
All Application Manual Name SummaryHelp

  • swipl
    • library
      • error.pl
      • debug.pl -- Print debug messages and test assertions
      • apply.pl -- Apply predicates on a list
      • lists.pl -- List Manipulation
      • broadcast.pl -- Event service
      • predicate_options.pl
      • shlib.pl -- Utility library for loading foreign objects (DLLs, shared objects)
      • option.pl -- Option list processing
      • thread_pool.pl
      • gensym.pl
      • settings.pl -- Setting management
      • arithmetic.pl
      • main.pl -- Provide entry point for scripts
      • readutil.pl
      • operators.pl -- Manage operators
      • pairs.pl -- Operations on key-value lists
      • prolog_source.pl -- Examine Prolog source-files
      • record.pl -- Access compound arguments by name
      • quasi_quotations.pl -- Define Quasi Quotation syntax
      • pure_input.pl -- Pure Input from files and streams
      • solution_sequences.pl -- Modify solution sequences
      • ordsets.pl -- Ordered set manipulation
      • random.pl -- Random numbers
      • base64.pl -- Base64 encoding and decoding
      • aggregate.pl -- Aggregation operators on backtrackable predicates
      • yall.pl -- Lambda expressions
      • 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
      • csv.pl -- Process CSV (Comma-Separated Values) data
      • pprint.pl -- Pretty Print Prolog terms
      • atom.pl -- Operations on atoms
      • 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
      • ugraphs.pl -- Graph manipulation library
      • iostream.pl -- Utilities to deal with streams
      • url.pl -- Analysing and constructing URL
      • www_browser.pl -- Open a URL in the users browser
      • prolog_pack.pl -- A package manager for Prolog
      • git.pl -- Run GIT commands
      • utf8.pl -- UTF-8 encoding/decoding on lists of character codes.
      • quintus.pl -- Quintus compatibility
      • prolog_versions.pl -- Demand specific (Prolog) versions
      • prolog_wrap.pl -- Wrapping predicates
      • dialect.pl -- Support multiple Prolog dialects
      • date.pl -- Process dates and times
      • persistency.pl -- Provide persistent dynamic predicates
      • prolog_code.pl -- Utilities for reasoning about code
      • strings.pl -- String utilities
      • dif.pl -- The dif/2 constraint
      • edinburgh.pl -- Some traditional Edinburgh predicates
      • terms.pl -- Term manipulation
      • ansi_term.pl -- Print decorated text to ANSI consoles
      • threadutil.pl -- Interactive thread utilities
      • 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
      • sort.pl
      • dicts.pl -- Dict utilities
      • varnumbers.pl -- Utilities for numbered terms
      • rbtrees.pl -- Red black trees
      • backcomp.pl -- Backward compatibility
      • charsio.pl -- I/O on Lists of Character Codes
      • base32.pl -- Base32 encoding and decoding
      • codesio.pl -- I/O on Lists of Character Codes
      • coinduction.pl -- Co-Logic Programming
      • statistics.pl -- Get information about resource usage
      • heaps.pl -- heaps/priority queues
      • when.pl -- Conditional coroutining
      • nb_set.pl -- Non-backtrackable sets
      • ctypes.pl -- Character code classification
      • listing.pl -- List programs and pretty print clauses
      • intercept.pl -- Intercept and signal interface
      • system.pl -- System utilities
      • prolog_debug.pl -- User level debugging tools
      • oset.pl -- Ordered set manipulation
      • writef.pl -- Old-style formatted write
      • tables.pl -- XSB interface to tables
      • make.pl -- Reload modified source files
      • vm.pl -- SWI-Prolog Virtual Machine utilities
      • thread.pl -- High level thread primitives
      • increval.pl -- Incremental dynamic predicate modification
      • check.pl -- Consistency checking
      • hashtable.pl -- Hash tables
      • tty.pl -- Terminal operations
      • optparse.pl -- command line parsing
      • exceptions.pl -- Exception classification
      • shell.pl -- Elementary shell commands
      • edit.pl -- Editor interface
      • streams.pl -- Manage Prolog streams
      • explain.pl -- Describe Prolog Terms
      • qsave.pl -- Save current program as a state or executable
      • zip.pl -- Access resource ZIP archives
      • prolog_autoload.pl -- Autoload all dependencies
      • prolog_codewalk.pl -- Prolog code walker
      • readln.pl -- Read line as list of tokens
      • help.pl -- Text based manual
      • portray_text.pl -- Portray text
      • qpforeign.pl -- Quintus compatible foreign loader
      • prolog_deps.pl -- Compute file dependencies
      • win_menu.pl -- Console window menu
      • fastrw.pl -- Fast reading and writing of terms
      • prolog_config.pl -- Provide configuration information
      • prolog_profile.pl -- Execution profiler
      • prolog_coverage.pl -- Coverage analysis tool
      • prolog_history.pl -- Per-directory persistent commandline history
      • macros.pl -- Macro expansion
      • prolog_trace.pl -- Print access to predicates
      • check_installation.pl -- Check installation issues and features
      • prolog_metainference.pl -- Infer meta-predicate properties
      • rwlocks.pl -- Read/write locks
        • with_rwlock/3
        • with_rwlock/4
      • nb_rbtrees.pl -- Non-backtrackable operations on red black trees
      • files.pl
      • prolog_jiti.pl -- Just In Time Indexing (JITI) utilities
 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.