• R
    redesign cond var implementation to fix multiple issues · 37195db8
    Rich Felker 提交于
    the immediate issue that was reported by Jens Gustedt and needed to be
    fixed was corruption of the cv/mutex waiter states when switching to
    using a new mutex with the cv after all waiters were unblocked but
    before they finished returning from the wait function.
    
    self-synchronized destruction was also handled poorly and may have had
    race conditions. and the use of sequence numbers for waking waiters
    admitted a theoretical missed-wakeup if the sequence number wrapped
    through the full 32-bit space.
    
    the new implementation is largely documented in the comments in the
    source. the basic principle is to use linked lists initially attached
    to the cv object, but detachable on signal/broadcast, made up of nodes
    residing in automatic storage (stack) on the threads that are waiting.
    this eliminates the need for waiters to access the cv object after
    they are signaled, and allows us to limit wakeup to one waiter at a
    time during broadcasts even when futex requeue cannot be used.
    
    performance is also greatly improved, roughly double some tests.
    
    basically nothing is changed in the process-shared cond var case,
    where this implementation does not work, since processes do not have
    access to one another's local storage.
    37195db8
pthread_cond_init.c 258 字节