I wrote:
> I did a survey of the various behaviours of rwlock implementations [1].
> Find the results there [2].

> [1] 
> https://gitweb.git.savannah.gnu.org/gitweb/?p=gnulib/maint-tools.git;a=tree;f=test-programs/pthread-rwlock;h=bc63cb8ee32bf508f0b7daab6f367fd507786a2b;hb=HEAD
> [2] 
> https://gitweb.git.savannah.gnu.org/gitweb/?p=gnulib/maint-tools.git;a=blob_plain;f=test-programs/pthread-rwlock/results.txt;hb=HEAD

In fact, these results were incomplete, because I did some of them on VMs
with just 1 CPU. The result with more CPUs are different: Find attached

  * out.1_cpu, out.2_cpus, out.4_cpus, out.8_cpus
    the results with limitation to 1, 2, 4, or 8 CPUs (done with the
    "taskset -c" command in an Alpine Linux 3.20 VM with 8 CPUs),

  * out.fifo, out.rr, out.other, out.idle
    the results with different Linux scheduling policies (done with the
    "chrt" command in an Alpine Linux 3.20 VM with 8 CPUs).

The summary is, in all 4 cases:

  When releasing the last reader lock:
    If at least one of the enqueued lock attempts is for reading, the
    first one of them is granted.
    Otherwise, the first of the waiting write attempts is granted.
  When releasing a writer lock:
    ???
  This implementation does not globally prefer readers, only when releasing
  a reader lock.
  This implementation does not prefer writers.

The influence of the Linux scheduling policy that Natanael detected [1]
probably comes from the fact that musl does not actually distinguish readers
from writers to be awoken and instead leaves that distinction to the kernel.
(See musl/src/thread/pthread_rwlock_unlock.c.)

Whereas the non-influence of the Linux scheduling policy on glibc systems
that I see [2] can be explained by the detailed case-by-case logic found in
glibc/nptl/pthread_rwlock_unlock.c
glibc/nptl/pthread_rwlock_common.c

Bruno

[1] https://lists.gnu.org/archive/html/bug-gnulib/2025-05/msg00164.html
[2] https://lists.gnu.org/archive/html/bug-gnulib/2025-05/msg00167.html
Default
  When releasing the last reader lock:
    If at least one of the enqueued lock attempts is for reading, the
    first one of them is granted.
    Otherwise, the first of the waiting write attempts is granted.
  When releasing a writer lock:
    The first of the enqueued lock attempts is granted.
  This implementation does not globally prefer readers, only when releasing
  a reader lock.
  This implementation does not prefer writers.
  This implementation is deterministic.
Default
    WRR => W1 R2 R3
    WRW => W1 W3 R2
    WWR => W1 R3 W2
    WWW => W1 W2 W3
    WRRR => W1 R2 R3 R4
    WRRW => W1 R2 R3 W4
    WRWR => W1 W3 R4 R2
    WRWW => W1 R2 W3 W4
    WWRR => W1 W2 R3 R4
    WWRW => W1 W2 R3 W4
    WWWR => W1 W2 W3 R4
    WWWW => W1 W2 W4 W3
    WRRRR => W1 R2 R3 R4 R5
    WRRRW => W1 R2 R3 R4 W5
    WRRWR => W1 R2 R3 W4 R5
    WRRWW => W1 R2 R3 W4 W5
    WRWRR => W1 W3 R4 R2 R5
    WRWRW => W1 R2 W3 R4 W5
    WRWWR => W1 R2 W3 W4 R5
    WRWWW => W1 R2 W3 W4 W5
    WWRRR => W1 W2 R4 R5 R3
    WWRRW => W1 W2 R3 R4 W5
    WWRWR => W1 R3 W2 W4 R5
    WWRWW => W1 W2 R3 W4 W5
    WWWRR => W1 W2 R4 R5 W3
    WWWRW => W1 W2 W3 R4 W5
    WWWWR => W1 W2 W4 R5 W3
    WWWWW => W1 W2 W3 W4 W5
    WRR => W1 R2 R3
    WRW => W1 W3 R2
    WWR => W1 R3 W2
    WWW => W1 W3 W2
    WRRR => W1 R2 R3 R4
    WRRW => W1 R3 R2 W4
    WRWR => W1 R2 W3 R4
    WRWW => W1 W3 R2 W4
    WWRR => W1 W2 R3 R4
    WWRW => W1 R3 W2 W4
    WWWR => W1 W3 R4 W2
    WWWW => W1 W2 W3 W4
    WRRRR => W1 R2 R3 R4 R5
    WRRRW => W1 R2 R3 R4 W5
    WRRWR => W1 R3 R2 W4 R5
    WRRWW => W1 R3 R2 W4 W5
    WRWRR => W1 R2 W3 R4 R5
    WRWRW => W1 W3 R2 R4 W5
    WRWWR => W1 R2 W3 W4 R5
    WRWWW => W1 W3 W4 W5 R2
    WWRRR => W1 W2 R3 R4 R5
    WWRRW => W1 W2 R3 R4 W5
    WWRWR => W1 W2 R3 W4 R5
    WWRWW => W1 R3 W2 W4 W5
    WWWRR => W1 W3 W2 R4 R5
    WWWRW => W1 W2 W3 R4 W5
    WWWWR => W1 W2 W4 R5 W3
    WWWWW => W1 W3 W4 W5 W2
    WRR => W1 R3 R2
    WRW => W1 R2 W3
    WWR => W1 R3 W2
    WWW => W1 W2 W3
    WRRR => W1 R3 R2 R4
    WRRW => W1 R2 R3 W4
    WRWR => W1 W3 R2 R4
    WRWW => W1 R2 W4 W3
    WWRR => W1 W2 R3 R4
    WWRW => W1 W2 R3 W4
    WWWR => W1 W2 W3 R4
    WWWW => W1 W3 W2 W4
    WRRRR => W1 R2 R3 R4 R5
    WRRRW => W1 R2 R3 R4 W5
    WRRWR => W1 R2 R3 W4 R5
    WRRWW => W1 R2 R3 W4 W5
    WRWRR => W1 R2 R4 R5 W3
    WRWRW => W1 R2 W3 R4 W5
    WRWWR => W1 R2 W3 W4 R5
    WRWWW => W1 W3 R2 W4 W5
    WWRRR => W1 R3 W2 R4 R5
    WWRRW => W1 R3 R4 W5 W2
    WWRWR => W1 W2 W4 R5 R3
    WWRWW => W1 R3 W2 W4 W5
    WWWRR => W1 W2 W3 R5 R4
    WWWRW => W1 W2 R4 W5 W3
    WWWWR => W1 W2 W4 R5 W3
    WWWWW => W1 W2 W4 W5 W3
  When releasing the last reader lock:
    If at least one of the enqueued lock attempts is for reading, the
    first one of them is granted.
    Otherwise, the first of the waiting write attempts is granted.
  When releasing a writer lock:
    ???
  This implementation does not globally prefer readers, only when releasing
  a reader lock.
  This implementation does not prefer writers.
Default
    WRR => W1 R2 R3
    WRW => W1 W3 R2
    WWR => W1 R3 W2
    WWW => W1 W2 W3
    WRRR => W1 R2 R4 R3
    WRRW => W1 R2 R3 W4
    WRWR => W1 R2 W3 R4
    WRWW => W1 R2 W3 W4
    WWRR => W1 R3 W2 R4
    WWRW => W1 W2 R3 W4
    WWWR => W1 W3 W2 R4
    WWWW => W1 W2 W3 W4
    WRRRR => W1 R4 R3 R5 R2
    WRRRW => W1 R3 R4 R2 W5
    WRRWR => W1 R3 R2 R5 W4
    WRRWW => W1 R2 R3 W5 W4
    WRWRR => W1 R2 W3 R4 R5
    WRWRW => W1 R2 W3 R4 W5
    WRWWR => W1 R2 W3 R5 W4
    WRWWW => W1 R2 W3 W5 W4
    WWRRR => W1 W2 R3 R5 R4
    WWRRW => W1 W2 R4 R3 W5
    WWRWR => W1 W2 R3 W4 R5
    WWRWW => W1 W2 R3 W4 W5
    WWWRR => W1 W2 W3 R4 R5
    WWWRW => W1 W2 W3 W5 R4
    WWWWR => W1 W3 W2 W4 R5
    WWWWW => W1 W2 W3 W4 W5
    WRR => W1 R3 R2
    WRW => W1 R2 W3
    WWR => W1 W2 R3
    WWW => W1 W3 W2
    WRRR => W1 R2 R3 R4
    WRRW => W1 R2 R3 W4
    WRWR => W1 R2 W3 R4
    WRWW => W1 W3 R2 W4
    WWRR => W1 R3 W2 R4
    WWRW => W1 W2 R3 W4
    WWWR => W1 R4 W3 W2
    WWWW => W1 W3 W2 W4
    WRRRR => W1 R2 R3 R4 R5
    WRRRW => W1 R4 R2 R3 W5
    WRRWR => W1 R2 R3 W4 R5
    WRRWW => W1 R2 R3 W4 W5
    WRWRR => W1 R2 R4 R5 W3
    WRWRW => W1 R2 W3 R4 W5
    WRWWR => W1 R2 W4 R5 W3
    WRWWW => W1 R2 W3 W5 W4
    WWRRR => W1 W2 R4 R3 R5
    WWRRW => W1 R3 W2 W5 R4
    WWRWR => W1 W2 R3 W4 R5
    WWRWW => W1 W2 R3 W5 W4
    WWWRR => W1 W2 R5 W3 R4
    WWWRW => W1 W2 W3 R4 W5
    WWWWR => W1 W2 W3 W4 R5
    WWWWW => W1 W2 W3 W4 W5
    WRR => W1 R2 R3
    WRW => W1 W3 R2
    WWR => W1 R3 W2
    WWW => W1 W2 W3
    WRRR => W1 R2 R4 R3
    WRRW => W1 R2 R3 W4
    WRWR => W1 W3 R4 R2
    WRWW => W1 R2 W3 W4
    WWRR => W1 W2 R3 R4
    WWRW => W1 W2 R3 W4
    WWWR => W1 W2 W3 R4
    WWWW => W1 W3 W2 W4
    WRRRR => W1 R2 R3 R4 R5
    WRRRW => W1 R3 R2 R4 W5
    WRRWR => W1 R2 R3 W4 R5
    WRRWW => W1 R2 R3 W4 W5
    WRWRR => W1 R2 W3 R4 R5
    WRWRW => W1 R4 R2 W3 W5
    WRWWR => W1 R2 W3 W4 R5
    WRWWW => W1 W3 R2 W5 W4
    WWRRR => W1 W2 R3 R4 R5
    WWRRW => W1 W2 W5 R4 R3
    WWRWR => W1 W2 R3 W4 R5
    WWRWW => W1 R3 W4 W5 W2
    WWWRR => W1 W3 R4 R5 W2
    WWWRW => W1 W2 R4 W5 W3
    WWWWR => W1 W2 W3 W4 R5
    WWWWW => W1 W2 W4 W3 W5
  When releasing the last reader lock:
    If at least one of the enqueued lock attempts is for reading, the
    first one of them is granted.
    Otherwise, the first of the waiting write attempts is granted.
  When releasing a writer lock:
    ???
  This implementation does not globally prefer readers, only when releasing
  a reader lock.
  This implementation does not prefer writers.
Default
    WRR => W1 R2 R3
    WRW => W1 R2 W3
    WWR => W1 R3 W2
    WWW => W1 W2 W3
    WRRR => W1 R3 R2 R4
    WRRW => W1 R2 R3 W4
    WRWR => W1 W3 R2 R4
    WRWW => W1 W3 R2 W4
    WWRR => W1 R3 W2 R4
    WWRW => W1 W2 R3 W4
    WWWR => W1 W2 W3 R4
    WWWW => W1 W3 W2 W4
    WRRRR => W1 R2 R3 R5 R4
    WRRRW => W1 R3 R2 R4 W5
    WRRWR => W1 R3 R2 R5 W4
    WRRWW => W1 R3 R2 W4 W5
    WRWRR => W1 W3 R2 R4 R5
    WRWRW => W1 W3 R4 R2 W5
    WRWWR => W1 R2 W3 W4 R5
    WRWWW => W1 R2 W3 W4 W5
    WWRRR => W1 W2 R4 R5 R3
    WWRRW => W1 W2 R4 W5 R3
    WWRWR => W1 R3 W4 R5 W2
    WWRWW => W1 W2 R3 W4 W5
    WWWRR => W1 W2 R4 W3 R5
    WWWRW => W1 W2 W3 W5 R4
    WWWWR => W1 W4 W2 R5 W3
    WWWWW => W1 W3 W2 W4 W5
    WRR => W1 R2 R3
    WRW => W1 R2 W3
    WWR => W1 W2 R3
    WWW => W1 W3 W2
    WRRR => W1 R3 R4 R2
    WRRW => W1 R2 R3 W4
    WRWR => W1 R4 R2 W3
    WRWW => W1 R2 W3 W4
    WWRR => W1 R3 R4 W2
    WWRW => W1 W2 W4 R3
    WWWR => W1 W2 W3 R4
    WWWW => W1 W2 W3 W4
    WRRRR => W1 R3 R5 R2 R4
    WRRRW => W1 R3 W5 R2 R4
    WRRWR => W1 R2 R3 W4 R5
    WRRWW => W1 R3 R2 W5 W4
    WRWRR => W1 R2 W3 R4 R5
    WRWRW => W1 R2 W3 R4 W5
    WRWWR => W1 R2 W3 R5 W4
    WRWWW => W1 R2 W5 W4 W3
    WWRRR => W1 W2 R3 R4 R5
    WWRRW => W1 R3 W2 W5 R4
    WWRWR => W1 W2 W4 R5 R3
    WWRWW => W1 R3 W2 W5 W4
    WWWRR => W1 W2 W3 R4 R5
    WWWRW => W1 W3 W2 W5 R4
    WWWWR => W1 W2 W3 W4 R5
    WWWWW => W1 W2 W3 W4 W5
  When releasing the last reader lock:
    If at least one of the enqueued lock attempts is for reading, the
    first one of them is granted.
    Otherwise, the first of the waiting write attempts is granted.
  When releasing a writer lock:
    ???
  This implementation does not globally prefer readers, only when releasing
  a reader lock.
  This implementation does not prefer writers.
Default
    WRR => W1 R2 R3
    WRW => W1 R2 W3
    WWR => W1 R3 W2
    WWW => W1 W3 W2
    WRRR => W1 R2 R3 R4
    WRRW => W1 R3 R2 W4
    WRWR => W1 W3 R4 R2
    WRWW => W1 R2 W3 W4
    WWRR => W1 W2 R3 R4
    WWRW => W1 W2 R3 W4
    WWWR => W1 W2 R4 W3
    WWWW => W1 W3 W4 W2
    WRRRR => W1 R3 R2 R4 R5
    WRRRW => W1 R2 R3 W5 R4
    WRRWR => W1 R2 R3 W4 R5
    WRRWW => W1 R2 R3 W4 W5
    WRWRR => W1 R2 R4 W3 R5
    WRWRW => W1 W3 R2 R4 W5
    WRWWR => W1 R2 W3 W4 R5
    WRWWW => W1 W3 R2 W4 W5
    WWRRR => W1 W2 R5 R3 R4
    WWRRW => W1 W2 R3 R4 W5
    WWRWR => W1 W2 R3 W4 R5
    WWRWW => W1 W2 W4 R3 W5
    WWWRR => W1 W2 W3 R4 R5
    WWWRW => W1 W3 W2 R4 W5
    WWWWR => W1 W3 W4 W2 R5
    WWWWW => W1 W3 W2 W4 W5
    WRR => W1 R3 R2
    WRW => W1 R2 W3
    WWR => W1 W2 R3
    WWW => W1 W2 W3
    WRRR => W1 R2 R3 R4
    WRRW => W1 R2 W4 R3
    WRWR => W1 R2 W3 R4
    WRWW => W1 R2 W3 W4
    WWRR => W1 W2 R3 R4
    WWRW => W1 W2 R3 W4
    WWWR => W1 W2 W3 R4
    WWWW => W1 W3 W2 W4
    WRRRR => W1 R2 R3 R4 R5
    WRRRW => W1 R3 R2 R4 W5
    WRRWR => W1 R3 R2 W4 R5
    WRRWW => W1 R2 W4 W5 R3
    WRWRR => W1 R2 R4 R5 W3
    WRWRW => W1 R2 W3 R4 W5
    WRWWR => W1 W4 W3 R2 R5
    WRWWW => W1 R2 W4 W5 W3
    WWRRR => W1 R3 W2 R4 R5
    WWRRW => W1 R3 W2 R4 W5
    WWRWR => W1 W2 R5 R3 W4
    WWRWW => W1 W2 W4 R3 W5
    WWWRR => W1 W2 W3 R5 R4
    WWWRW => W1 R4 W2 W3 W5
    WWWWR => W1 R5 W3 W2 W4
    WWWWW => W1 W3 W2 W4 W5
    WRR => W1 R2 R3
    WRW => W1 W3 R2
    WWR => W1 W2 R3
    WWW => W1 W2 W3
    WRRR => W1 R2 R3 R4
    WRRW => W1 R2 R3 W4
    WRWR => W1 R2 W3 R4
    WRWW => W1 W3 R2 W4
    WWRR => W1 R4 R3 W2
    WWRW => W1 W2 R3 W4
    WWWR => W1 W3 R4 W2
    WWWW => W1 W2 W3 W4
    WRRRR => W1 R2 R3 R4 R5
    WRRRW => W1 R4 R2 R3 W5
    WRRWR => W1 R2 W4 R3 R5
    WRRWW => W1 R3 R2 W5 W4
    WRWRR => W1 W3 R2 R4 R5
    WRWRW => W1 R4 R2 W3 W5
    WRWWR => W1 R2 W4 R5 W3
    WRWWW => W1 R2 W3 W4 W5
    WWRRR => W1 R4 R3 W2 R5
    WWRRW => W1 W2 R4 R3 W5
    WWRWR => W1 R3 W2 W4 R5
    WWRWW => W1 R3 W2 W5 W4
    WWWRR => W1 W2 R4 R5 W3
    WWWRW => W1 W2 W3 R4 W5
    WWWWR => W1 W2 W3 W4 R5
    WWWWW => W1 W2 W4 W3 W5
  When releasing the last reader lock:
    If at least one of the enqueued lock attempts is for reading, the
    first one of them is granted.
    Otherwise, the first of the waiting write attempts is granted.
  When releasing a writer lock:
    ???
  This implementation does not globally prefer readers, only when releasing
  a reader lock.
  This implementation does not prefer writers.
Default
    WRR => W1 R3 R2
    WRW => W1 R2 W3
    WWR => W1 R3 W2
    WWW => W1 W3 W2
    WRRR => W1 R2 R3 R4
    WRRW => W1 R3 R2 W4
    WRWR => W1 R2 R4 W3
    WRWW => W1 R2 W4 W3
    WWRR => W1 W2 R4 R3
    WWRW => W1 R3 W2 W4
    WWWR => W1 R4 W2 W3
    WWWW => W1 W2 W4 W3
    WRRRR => W1 R3 R2 R4 R5
    WRRRW => W1 R4 R3 R2 W5
    WRRWR => W1 R3 R5 R2 W4
    WRRWW => W1 R2 R3 W4 W5
    WRWRR => W1 R4 R2 W3 R5
    WRWRW => W1 W3 R4 W5 R2
    WRWWR => W1 R2 W3 W4 R5
    WRWWW => W1 W3 R2 W4 W5
    WWRRR => W1 R5 R3 R4 W2
    WWRRW => W1 R3 R4 W5 W2
    WWRWR => W1 W2 W4 R5 R3
    WWRWW => W1 W4 W2 R3 W5
    WWWRR => W1 W2 R4 W3 R5
    WWWRW => W1 W3 W2 R4 W5
    WWWWR => W1 W3 W2 W4 R5
    WWWWW => W1 W2 W3 W5 W4
    WRR => W1 R3 R2
    WRW => W1 R2 W3
    WWR => W1 W2 R3
    WWW => W1 W2 W3
    WRRR => W1 R3 R2 R4
    WRRW => W1 R2 R3 W4
    WRWR => W1 R2 W3 R4
    WRWW => W1 R2 W3 W4
    WWRR => W1 R4 R3 W2
    WWRW => W1 W2 W4 R3
    WWWR => W1 W2 R4 W3
    WWWW => W1 W3 W2 W4
    WRRRR => W1 R3 R2 R4 R5
    WRRRW => W1 R2 R3 R4 W5
    WRRWR => W1 R2 R3 W4 R5
    WRRWW => W1 W4 W5 R2 R3
    WRWRR => W1 R2 W3 R4 R5
    WRWRW => W1 R2 R4 W3 W5
    WRWWR => W1 R2 W4 W3 R5
    WRWWW => W1 R2 W3 W5 W4
    WWRRR => W1 R3 W2 R5 R4
    WWRRW => W1 R3 R4 W2 W5
    WWRWR => W1 R3 W2 W4 R5
    WWRWW => W1 W2 R3 W4 W5
    WWWRR => W1 W2 R5 R4 W3
    WWWRW => W1 R4 W2 W3 W5
    WWWWR => W1 W3 W4 R5 W2
    WWWWW => W1 W2 W3 W4 W5
    WRR => W1 R2 R3
    WRW => W1 R2 W3
    WWR => W1 W2 R3
    WWW => W1 W2 W3
    WRRR => W1 R2 R3 R4
    WRRW => W1 R2 R3 W4
    WRWR => W1 W3 R2 R4
    WRWW => W1 W3 W4 R2
    WWRR => W1 R4 W2 R3
    WWRW => W1 W2 R3 W4
    WWWR => W1 W3 W2 R4
    WWWW => W1 W2 W3 W4
    WRRRR => W1 R2 R3 R5 R4
    WRRRW => W1 R4 R2 R3 W5
    WRRWR => W1 R2 R3 R5 W4
    WRRWW => W1 R2 R3 W5 W4
    WRWRR => W1 W3 R2 R4 R5
    WRWRW => W1 W5 R2 R4 W3
    WRWWR => W1 R2 R5 W4 W3
    WRWWW => W1 R2 W3 W5 W4
    WWRRR => W1 W2 R4 R3 R5
    WWRRW => W1 W2 R3 R4 W5
    WWRWR => W1 W2 R3 W4 R5
    WWRWW => W1 R3 W2 W4 W5
    WWWRR => W1 W2 R4 W3 R5
    WWWRW => W1 W2 W3 R4 W5
    WWWWR => W1 W2 W3 W4 R5
    WWWWW => W1 W4 W5 W3 W2
  When releasing the last reader lock:
    If at least one of the enqueued lock attempts is for reading, the
    first one of them is granted.
    Otherwise, the first of the waiting write attempts is granted.
  When releasing a writer lock:
    ???
  This implementation does not globally prefer readers, only when releasing
  a reader lock.
  This implementation does not prefer writers.
Default
    WRR => W1 R2 R3
    WRW => W1 R2 W3
    WWR => W1 W2 R3
    WWW => W1 W2 W3
    WRRR => W1 R2 R3 R4
    WRRW => W1 R2 R3 W4
    WRWR => W1 R2 W3 R4
    WRWW => W1 R2 W3 W4
    WWRR => W1 R4 R3 W2
    WWRW => W1 R3 W2 W4
    WWWR => W1 R4 W2 W3
    WWWW => W1 W4 W2 W3
    WRRRR => W1 R4 R2 R3 R5
    WRRRW => W1 R3 R2 W5 R4
    WRRWR => W1 W4 R3 R5 R2
    WRRWW => W1 R3 R2 W4 W5
    WRWRR => W1 W3 R2 R5 R4
    WRWRW => W1 R4 W3 R2 W5
    WRWWR => W1 W4 R2 R5 W3
    WRWWW => W1 R2 W3 W4 W5
    WWRRR => W1 R3 W2 R5 R4
    WWRRW => W1 W2 R3 R4 W5
    WWRWR => W1 W4 R3 W2 R5
    WWRWW => W1 W4 W2 R3 W5
    WWWRR => W1 W2 R4 W3 R5
    WWWRW => W1 W2 R4 W5 W3
    WWWWR => W1 W3 W2 W4 R5
    WWWWW => W1 W4 W2 W5 W3
    WRR => W1 R2 R3
    WRW => W1 R2 W3
    WWR => W1 R3 W2
    WWW => W1 W3 W2
    WRRR => W1 R2 R3 R4
    WRRW => W1 R2 R3 W4
    WRWR => W1 R2 R4 W3
    WRWW => W1 R2 W4 W3
    WWRR => W1 W2 R4 R3
    WWRW => W1 W2 R3 W4
    WWWR => W1 W3 W2 R4
    WWWW => W1 W3 W2 W4
    WRRRR => W1 R3 R4 R2 R5
    WRRRW => W1 R3 R2 W5 R4
    WRRWR => W1 R2 R3 R5 W4
    WRRWW => W1 R2 R3 W4 W5
    WRWRR => W1 R2 W3 R5 R4
    WRWRW => W1 R2 W3 W5 R4
    WRWWR => W1 R2 W4 W3 R5
    WRWWW => W1 R2 W4 W3 W5
    WWRRR => W1 W2 R3 R5 R4
    WWRRW => W1 W2 R3 W5 R4
    WWRWR => W1 W2 R3 R5 W4
    WWRWW => W1 R3 W2 W4 W5
    WWWRR => W1 W3 W2 R4 R5
    WWWRW => W1 W3 W2 R4 W5
    WWWWR => W1 W2 W3 W4 R5
    WWWWW => W1 W3 W2 W4 W5
    WRR => W1 R2 R3
    WRW => W1 R2 W3
    WWR => W1 W2 R3
    WWW => W1 W2 W3
    WRRR => W1 R2 R3 R4
    WRRW => W1 R2 R3 W4
    WRWR => W1 R2 W3 R4
    WRWW => W1 R2 W3 W4
    WWRR => W1 W2 R3 R4
    WWRW => W1 W2 R3 W4
    WWWR => W1 W2 R4 W3
    WWWW => W1 W2 W3 W4
    WRRRR => W1 R2 R5 R3 R4
    WRRRW => W1 R2 R3 R4 W5
    WRRWR => W1 R2 R3 W4 R5
    WRRWW => W1 R2 R3 W4 W5
    WRWRR => W1 R2 W3 R5 R4
    WRWRW => W1 R4 R2 W3 W5
    WRWWR => W1 W3 R2 W4 R5
    WRWWW => W1 R2 W3 W5 W4
    WWRRR => W1 W2 R3 R4 R5
    WWRRW => W1 W2 R4 R3 W5
    WWRWR => W1 W2 W4 R3 R5
    WWRWW => W1 W2 R3 W4 W5
    WWWRR => W1 W2 W3 R5 R4
    WWWRW => W1 W2 W3 R4 W5
    WWWWR => W1 W2 W3 W4 R5
    WWWWW => W1 W2 W3 W5 W4
  When releasing the last reader lock:
    If at least one of the enqueued lock attempts is for reading, the
    first one of them is granted.
    Otherwise, the first of the waiting write attempts is granted.
  When releasing a writer lock:
    ???
  This implementation does not globally prefer readers, only when releasing
  a reader lock.
  This implementation does not prefer writers.
Default
    WRR => W1 R2 R3
    WRW => W1 W3 R2
    WWR => W1 R3 W2
    WWW => W1 W2 W3
    WRRR => W1 R2 R3 R4
    WRRW => W1 R2 R3 W4
    WRWR => W1 R2 W3 R4
    WRWW => W1 W3 R2 W4
    WWRR => W1 W2 R4 R3
    WWRW => W1 R3 W2 W4
    WWWR => W1 W3 R4 W2
    WWWW => W1 W3 W2 W4
    WRRRR => W1 R3 R2 R4 R5
    WRRRW => W1 R3 R2 W5 R4
    WRRWR => W1 R2 R3 R5 W4
    WRRWW => W1 R3 R2 W5 W4
    WRWRR => W1 R2 W3 R4 R5
    WRWRW => W1 R2 W3 R4 W5
    WRWWR => W1 R2 W4 W3 R5
    WRWWW => W1 R2 W4 W3 W5
    WWRRR => W1 R3 W2 R5 R4
    WWRRW => W1 R3 W2 R4 W5
    WWRWR => W1 R3 W2 R5 W4
    WWRWW => W1 R3 W2 W4 W5
    WWWRR => W1 W3 W2 R5 R4
    WWWRW => W1 W3 R4 W5 W2
    WWWWR => W1 W3 W2 R5 W4
    WWWWW => W1 W3 W2 W5 W4
    WRR => W1 R3 R2
    WRW => W1 W3 R2
    WWR => W1 R3 W2
    WWW => W1 W3 W2
    WRRR => W1 R3 R2 R4
    WRRW => W1 R3 R2 W4
    WRWR => W1 W3 R2 R4
    WRWW => W1 W3 R2 W4
    WWRR => W1 R3 W2 R4
    WWRW => W1 R3 W2 W4
    WWWR => W1 W2 W3 R4
    WWWW => W1 W3 W2 W4
    WRRRR => W1 R2 R4 R5 R3
    WRRRW => W1 R2 R3 R4 W5
    WRRWR => W1 R2 R3 W4 R5
    WRRWW => W1 R3 R2 W5 W4
    WRWRR => W1 R2 W3 R5 R4
    WRWRW => W1 R2 W3 W5 R4
    WRWWR => W1 R2 W3 W4 R5
    WRWWW => W1 R2 W3 W4 W5
    WWRRR => W1 R3 W2 R4 R5
    WWRRW => W1 W2 R3 R4 W5
    WWRWR => W1 W2 R3 W4 R5
    WWRWW => W1 W2 W4 W5 R3
    WWWRR => W1 W2 R4 W3 R5
    WWWRW => W1 W2 W3 R4 W5
    WWWWR => W1 W2 W4 W3 R5
    WWWWW => W1 W2 W5 W3 W4
    WRR => W1 R2 R3
    WRW => W1 R2 W3
    WWR => W1 W2 R3
    WWW => W1 W2 W3
    WRRR => W1 R2 R3 R4
    WRRW => W1 R2 R3 W4
    WRWR => W1 R2 W3 R4
    WRWW => W1 R2 W4 W3
    WWRR => W1 R3 R4 W2
    WWRW => W1 W2 R3 W4
    WWWR => W1 W2 W3 R4
    WWWW => W1 W2 W3 W4
    WRRRR => W1 R2 R4 R5 R3
    WRRRW => W1 R2 R4 R3 W5
    WRRWR => W1 R2 R5 W4 R3
    WRRWW => W1 R2 R3 W4 W5
    WRWRR => W1 R2 W3 R4 R5
    WRWRW => W1 R2 W3 R4 W5
    WRWWR => W1 R2 W4 R5 W3
    WRWWW => W1 W4 W3 W5 R2
    WWRRR => W1 W2 R3 R4 R5
    WWRRW => W1 W2 R3 R4 W5
    WWRWR => W1 W2 R3 W4 R5
    WWRWW => W1 W2 W4 R3 W5
    WWWRR => W1 W2 R4 R5 W3
    WWWRW => W1 W2 W3 W5 R4
    WWWWR => W1 W2 R5 W3 W4
    WWWWW => W1 W2 W3 W4 W5
  When releasing the last reader lock:
    If at least one of the enqueued lock attempts is for reading, the
    first one of them is granted.
    Otherwise, the first of the waiting write attempts is granted.
  When releasing a writer lock:
    ???
  This implementation does not globally prefer readers, only when releasing
  a reader lock.
  This implementation does not prefer writers.

Reply via email to