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.