diff --git a/src/sync/cond.rs b/src/sync/cond.rs index 19f9868a19..171a35dc3a 100644 --- a/src/sync/cond.rs +++ b/src/sync/cond.rs @@ -61,8 +61,14 @@ impl Cond { self.wake(i32::MAX) } pub fn signal(&self) -> Result<(), Errno> { - self.broadcast() - //self.wake(1) + // POSIX requires pthread_cond_signal to wake AT LEAST ONE waiter that + // is currently waiting on the condition variable, but it must not + // wake all waiters (that is pthread_cond_broadcast semantics). + // Wake exactly one via FUTEX_WAKE with count=1. Using broadcast() here + // was a thundering-herd bug: every cond_signal woke every waiter on + // every CPU. Fixed 2026-07-02 (Red Bear OS multi-threading plan, + // Phase 0a). + self.wake(1) } pub fn clockwait( &self,