Natanael Copa wrote:
> > It passed with chrt --fifo (I had to do it from outside the LXC container):
> >
> > # time chrt --fifo 10 ./test-pthread-rwlock
> > Starting test_rwlock ... OK
> > real 0m 33.00s
> > user 6m 50.63s
> > sys 0m 16.23s
I then wrote:
> * On x86_64 (Alpine Linux), the test performs about 25% faster
> under SCHED_FIFO and SCHED_RR.
Note: that measurement was in an Alpine Linux VM with 1 CPU.
I tried to incorporate this speedup into the test, by use of the
attached patch. But unfortunately, it does not help. Here are
the timings on that Alpine Linux VM (-fifo is the patched unit test):
1 CPU 2 CPUs
4 CPUs 8 CPUs
$ time ./test-pthread-rwlock 1.56 s 2.02 s
1.09 s 0.70 s
$ time ./test-pthread-rwlock-fifo 1.57 s 2.00 s
1.06 s 0.74 s
# time chrt --fifo 10 ./test-pthread-rwlock 1.24 s 3.3 s
1.8 s 0.69 s
# time chrt --fifo 10 ./test-pthread-rwlock-fifo 1.26 s 3.2 s
1.8 s 0.69 s
And on Solaris and Cygwin, I don't see a measurable difference either.
Bruno
>From 3a46de9041b213e838c2654f29aa1e7cc13347cb Mon Sep 17 00:00:00 2001
From: Bruno Haible <[email protected]>
Date: Fri, 16 May 2025 13:15:56 +0200
Subject: [PATCH] pthread-rwlock tests: Attempt to minimize writer starvation
symptoms.
Reported by Natanael Copa <[email protected]> in
<https://lists.gnu.org/archive/html/bug-gnulib/2025-05/msg00164.html>.
* tests/test-pthread-rwlock.c (test_rwlock): Create the threads with the
schedpolicy attribute set to SCHED_FIFO.
---
ChangeLog | 8 ++++++++
tests/test-pthread-rwlock.c | 28 +++++++++++++++++++++-------
2 files changed, 29 insertions(+), 7 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 371af7fada..cf9721df7e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2025-05-16 Bruno Haible <[email protected]>
+
+ pthread-rwlock tests: Attempt to minimize writer starvation symptoms.
+ Reported by Natanael Copa <[email protected]> in
+ <https://lists.gnu.org/archive/html/bug-gnulib/2025-05/msg00164.html>.
+ * tests/test-pthread-rwlock.c (test_rwlock): Create the threads with the
+ schedpolicy attribute set to SCHED_FIFO.
+
2025-05-14 Bruno Haible <[email protected]>
asyncsafe-spin: Rely on module 'spin'.
diff --git a/tests/test-pthread-rwlock.c b/tests/test-pthread-rwlock.c
index 90d6ac5017..83d09c8c96 100644
--- a/tests/test-pthread-rwlock.c
+++ b/tests/test-pthread-rwlock.c
@@ -175,13 +175,27 @@ test_rwlock (void)
set_atomic_int_value (&rwlock_checker_done, 0);
/* Spawn the threads. */
- for (i = 0; i < THREAD_COUNT; i++)
- ASSERT (pthread_create (&checkerthreads[i], NULL,
- rwlock_checker_thread, NULL)
- == 0);
- for (i = 0; i < THREAD_COUNT; i++)
- ASSERT (pthread_create (&threads[i], NULL, rwlock_mutator_thread, NULL)
- == 0);
+ {
+ pthread_attr_t attr;
+ ASSERT (pthread_attr_init (&attr) == 0);
+ /* Attempt to minimize the writer starvation symptoms, especially on
+ musl libc. See
+ <https://pubs.opengroup.org/onlinepubs/9799919799/functions/pthread_rwlock_rdlock.html>
+ <https://lists.gnu.org/archive/html/bug-gnulib/2025-05/msg00164.html> */
+ #if !(__GLIBC__ >= 2) && defined SCHED_FIFO
+ (void) pthread_attr_setschedpolicy (&attr, SCHED_FIFO);
+ #endif
+
+ for (i = 0; i < THREAD_COUNT; i++)
+ ASSERT (pthread_create (&checkerthreads[i], &attr,
+ rwlock_checker_thread, NULL)
+ == 0);
+ for (i = 0; i < THREAD_COUNT; i++)
+ ASSERT (pthread_create (&threads[i], &attr, rwlock_mutator_thread, NULL)
+ == 0);
+
+ ASSERT (pthread_attr_destroy (&attr) == 0);
+ }
/* Wait for the threads to terminate. */
for (i = 0; i < THREAD_COUNT; i++)
--
2.43.0