Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail From: "Chris M. Thomasson" Newsgroups: comp.lang.c++ Subject: Re: Solving thundering Herd with glibc... Date: Sat, 26 Apr 2025 14:41:31 -0700 Organization: A noiseless patient Spider Lines: 37 Message-ID: References: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Injection-Date: Sat, 26 Apr 2025 23:41:32 +0200 (CEST) Injection-Info: dont-email.me; posting-host="e58475fdd97ad2ccd378b8997cdea955"; logging-data="3416703"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18UuJ7MUe6jzMSl0o3iuoH+sRLlX3C+6rk=" User-Agent: Mozilla Thunderbird Cancel-Lock: sha1:EVzkj2ANv6ChRNQ/fhloFmymbqQ= In-Reply-To: Content-Language: en-US Bytes: 2728 On 4/26/2025 12:25 AM, Bonita Montero wrote: > Am 26.04.2025 um 08:26 schrieb Bonita Montero: >> Am 25.04.2025 um 22:01 schrieb Chris M. Thomasson: >> >>  > If you say so... Too busy right now. Perhaps sometime later on >> tonight. >> >> >> If there would be a thundering herd problem with glibc's condvar it >> would happen very often with my code since I awake 31 threads at once >> with my machine. > > I just tried to awaken all 31 threads from outside holding the mutex, > but not from inside: > >     for( size_t r = N; r; --r ) >     { >         unique_lock lock( mtx ); >         signalled = nClients; >         ai.store( nClients, memory_order_relaxed ); >         lock.unlock(); >         if( argc < 2 ) >             cv.notify_all(); >         else >             for( int c = nClients; c; cv.notify_one(), --c ); >         bs.acquire(); >     } > > The result: 7.500 context switches per thread, not 3.000. > >     10000 rounds, >     7498.06 context switches pe thread > > So never signal a condvar to multiple threads from outside ! So, do that. It's your software. Do what you like. This is a very old debate. Take your contrived test and just, roll with it. Whatever.