pthread_rwlock_rdlock导致读者数量为负数

时间:2015-07-27 11:10:06

标签: c multithreading pthreads

这种情况何时会发生?

我的一个线程现在停留在写入,另一个持续调用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

1 个答案:

答案 0 :(得分:1)

__nr_readersunsigned int - 至少在我的glibc版本中 - 您使用%d打印它,这是用于签名的整数。使用%u正确格式化。

__nr_readers递减超过零可能意味着您解锁锁的次数比锁定它多 - 这是未定义的行为。

(你不应该真的在那些锁定内部中徘徊 - 即使只是为了阅读__nr_readers你应该有glibc低级锁定来保护所持有的rwlock内部。)

如果你只有一个线程读取,那么无论如何使用rwlock都没有意义 - 你可能只是使用普通的互斥锁。 rwlock的好处是你可以让多个读者同时访问数据。