簡體   English   中英

pthread_rwlock_rdlock導致讀取器數量變為負數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM