这种情况何时会发生?
我的一个线程现在停留在写入,另一个持续调用read_lock导致负读者增加。所有写入尝试都由同一个线程完成,所有读取都由另一个线程完成。
以下是我的锁定义 - >
typedef sp_rwlock_t pthread_rwlock_t;
int
sp_rwlock_rlock(sp_rwlock_t *lock)
{
int status;
if (lock->__data.__nr_readers > 1) {
syslog(LOG_ERR,"%s:wierd readers :%d\n",__func__, lock->__data.__nr_readers);
}
if (lock) {
if ((status = pthread_rwlock_rdlock(lock)) == 0) {
return SP_OK;
} else {
syslog(LOG_ERR,"Error in func: %s errno is %x\n",__func__, status);
return SP_ERROR;
}
} /* if lock */
return SP_INVALID_ARG;
}
int
sp_rwlock_wlock(sp_rwlock_t *lock)
{
if (lock->__data.__nr_readers > 0) {
syslog(LOG_ERR,"%s:wierd readers\n",__func__);
}
if (lock) {
if (pthread_rwlock_wrlock(lock) == 0) {
return SP_OK;
} else {
syslog(LOG_ERR,"Error in func: %s errno is %x\n",__func__, errno);
return SP_ERROR;
}
} /* if lock */
return SP_INVALID_ARG;
}
看到以下日志 - >
sp_rwlock_rlock:奇怪的读者:-1
func中的错误:sp_rwlock_rlock errno是b
sp_rwlock_rlock:奇怪的读者:-3
sp_rwlock_rlock:奇怪的读者:-4
sp_rwlock_wlock:奇怪的读者
sp_rwlock_rlock:奇怪的读者:-5
sp_rwlock_rlock:奇怪的读者:-6
sp_rwlock_rlock:读者很奇怪:-7
答案 0 :(得分:1)
__nr_readers
是unsigned int
- 至少在我的glibc版本中 - 您使用%d
打印它,这是用于签名的整数。使用%u
正确格式化。
__nr_readers
递减超过零可能意味着您解锁锁的次数比锁定它多 - 这是未定义的行为。
(你不应该真的在那些锁定内部中徘徊 - 即使只是为了阅读__nr_readers
你应该有glibc低级锁定来保护所持有的rwlock内部。)
如果你只有一个线程读取,那么无论如何使用rwlock都没有意义 - 你可能只是使用普通的互斥锁。 rwlock的好处是你可以让多个读者同时访问数据。