Deutsch English Français Italiano |
<vue5hl$2aggi$1@dont-email.me> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!news.misty.com!weretis.net!feeder9.news.weretis.net!news.quux.org!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail From: "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> Newsgroups: comp.lang.c++ Subject: Re: signalling a condvar from inside vs. signalling a condvar von outside Date: Thu, 24 Apr 2025 13:05:08 -0700 Organization: A noiseless patient Spider Lines: 74 Message-ID: <vue5hl$2aggi$1@dont-email.me> References: <vte0g6$pmgv$1@raubtier-asyl.eternal-september.org> <vtpcnt$384n4$1@dont-email.me> <vtpu86$3qnsh$1@raubtier-asyl.eternal-september.org> <vtq3dt$3vg77$1@dont-email.me> <vtqo57$hi7r$1@raubtier-asyl.eternal-september.org> <vtrf3u$15mgp$1@dont-email.me> <vtsph1$2d55o$1@raubtier-asyl.eternal-september.org> <vtu9un$3mhje$1@dont-email.me> <vtub8i$3o27s$1@raubtier-asyl.eternal-september.org> <nPOMP.335105$j2D.258162@fx09.iad> <vu0f8m$1nm7v$2@raubtier-asyl.eternal-september.org> <eVVMP.1467426$BrX.929148@fx12.iad> <vu3obr$kp0a$2@dont-email.me> <vu4j24$1fq9b$1@raubtier-asyl.eternal-september.org> <vu6nrs$3b29s$1@dont-email.me> <vu78mg$3t3v4$1@raubtier-asyl.eternal-september.org> <vu925c$1esv8$1@dont-email.me> <vu9uqk$2bldm$1@raubtier-asyl.eternal-september.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Injection-Date: Thu, 24 Apr 2025 22:05:10 +0200 (CEST) Injection-Info: dont-email.me; posting-host="9ab23ff6e21fe9bbc243a2a98cfc6588"; logging-data="2441746"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18MRInDQXY+tebba7iRIUCdksjd2Bh3V88=" User-Agent: Mozilla Thunderbird Cancel-Lock: sha1:yTodaUE5Q2/ekfo4+jUnzVp3KOA= Content-Language: en-US In-Reply-To: <vu9uqk$2bldm$1@raubtier-asyl.eternal-september.org> Bytes: 4860 On 4/22/2025 10:46 PM, Bonita Montero wrote: > Now I wrote a little program to test if there's thundering herd problem > with glibc's mutex / condvar. This it is: > > #include <iostream> > #include <thread> > #include <mutex> > #include <condition_variable> > #include <atomic> > #include <semaphore> > #include <vector> > #include <sys/resource.h> > > using namespace std; > > int main() > { > constexpr size_t N = 10'000; > int nClients = thread::hardware_concurrency() - 1; > mutex mtx; > int signalled = 0; > condition_variable cv; > atomic_int ai( 0 ); > binary_semaphore bs( false ); > vector<jthread> clients; > atomic_int64_t nVoluntary( 0 ); > for( int c = nClients; c; --c ) > clients.emplace_back( [&] > { > for( size_t r = N; r; --r ) > { > unique_lock lock( mtx ); > cv.wait( lock, [&] { return (bool)signalled; } ); > --signalled; > lock.unlock(); > if( ai.fetch_sub( 1, memory_order_relaxed ) == 1 ) > bs.release( 1 ); > } > rusage ru; > getrusage( RUSAGE_THREAD, &ru ); > nVoluntary.fetch_add( ru.ru_nvcsw, memory_order_relaxed ); > } ); > for( size_t r = N; r; --r ) > { > unique_lock lock( mtx ); > signalled = nClients; > cv.notify_all(); > ai.store( nClients, memory_order_relaxed ); > lock.unlock(); > bs.acquire(); > } > clients.resize( 0 ); > cout << N << " rounds," << endl; > cout << (double)nVoluntary.load( memory_order_relaxed ) / nClients > << " context switches pe thread" << endl; > } > > It spawns one less threads than ther are hardware threads. These > all wait for a condvar and a counter which is initially the number > of threads and that must be > 0 for the wait to succeed. This counter > is decremented by each thread. Then the threads decrement an atomic > and if it becomes zero the last thread raises a semaphore, thereby > waking up the main thread. > This are the results for 10'000 rounds on a 32-thread machine: > > 10000 rounds, > 2777.29 context switches pe thread > > So there are less context-switches than rounds and there's no > thundering herd with glibc. > Sigh... Here is a challenge for you. Get it working in a race detector, say, Relacy?