浏览代码

fix failure-to-wake in rwlock unlock

a reader unlocking the lock need only wake one waiter (necessarily a
writer, but a writer unlocking the lock must wake all waiters
(necessarily readers). if it only wakes one, the remainder can remain
blocked indefinitely, or at least until the first reader unlocks (in
which case the whole lock becomes serialized and behaves as a mutex
rather than a read lock).
Rich Felker 13 年之前
父节点
当前提交
b85fec2ded
共有 1 个文件被更改,包括 1 次插入1 次删除
  1. 1 1
      src/thread/pthread_rwlock_unlock.c

+ 1 - 1
src/thread/pthread_rwlock_unlock.c

@@ -12,7 +12,7 @@ int pthread_rwlock_unlock(pthread_rwlock_t *rw)
 	} while (a_cas(&rw->_rw_lock, val, new) != val);
 
 	if (!new && (waiters || val<0))
-		__wake(&rw->_rw_lock, 1, 0);
+		__wake(&rw->_rw_lock, cnt, 0);
 
 	return 0;
 }