[英]pthread_rwlock_rdlock resulting in number of readers going as negative
什么時候會發生這種情況?
我的一個線程現在停留在寫操作上,另一個線程繼續調用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
函數錯誤: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
__nr_readers
是一個unsigned int
(至少在我的glibc版本中),並且您正在使用%d
(用於有符號的int)進行打印。 使用%u
正確格式化它。
__nr_readers
遞減到零以上可能意味着您解鎖的次數比已解鎖的次數多-這是未定義的行為。
(無論如何,您實際上都不應該真正地在那些鎖內部中__nr_readers
-即使只是為了讀取__nr_readers
您也應該擁有glibc低級鎖來保護rwlock內部。
如果您只讀取一個線程,那么無論如何都沒有必要使用rwlock-您最好只使用普通互斥量。 rwlock的好處是您可以讓多個讀取器同時訪問數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.