读写多线程中的读优先和写优先

Reader Preferred and Writer Preferred in Read-Write Multithreading

本文关键字:多线程 读写      更新时间:2023-10-16

我被分配使用POSIX线程编写一个读写实现。我想知道我的实现是否对这两种情况都是正确的:

第2次尝试

读者首选:

变量:

int readersActive_;
sem_t lock_;
sem_t writeLock_;
实现:

void PalindromeDatabase::lockReaders()
{
    sem_wait(&lock_);
    {
        ++readersActive_;
        if (readersActive_ == 1)
            sem_wait(&writeLock_);
    }
    sem_post(&lock_);
}
void PalindromeDatabase::unlockReaders()
{
    sem_wait(&lock_);
    {
        --readersActive_;
        if (readersActive_ == 0)
            sem_post(&writeLock_);
    }
    sem_post(&lock_);
}
void PalindromeDatabase::lockWriters()
{
    sem_wait(&writeLock_);
}
void PalindromeDatabase::unlockWriters()
{
    sem_post(&writeLock_);
}

作家首选:

变量:

int readersActive_;
int readersWaiting_;
int writersActive_;
int writersWaiting_;
pthread_mutex_t lock_;
pthread_cond_t read_;
pthread_cond_t write_;
实现:

void PalindromeDatabase::lockReaders()
{
    pthread_mutex_lock(&lock_);
    {
        if (writersActive_ || writersWaiting_)
        {
            ++readersWaiting_;
            do
            {
                pthread_cond_wait(&read_, &lock_);
            } while(writersActive_ || writersWaiting_);
            --readersWaiting_;
        }
        ++readersActive_;
    }
    pthread_mutex_unlock(&lock_);
}
void PalindromeDatabase::unlockReaders()
{
    pthread_mutex_lock(&lock_);
    {
        --readersActive_;
        if (writersWaiting_)
            pthread_cond_signal(&write_);
    }
    pthread_mutex_unlock(&lock_);
}
void PalindromeDatabase::lockWriters()
{
    pthread_mutex_lock(&lock_);
    {
        if (readersActive_ || writersActive_)
        {
            ++writersWaiting_;
            do
            {
                pthread_cond_wait(&write_, &lock_);
            } while(readersActive_ || writersActive_);
            --writersWaiting_;
        }
        writersActive_ = 1;
    }
    pthread_mutex_unlock(&lock_);
}
void PalindromeDatabase::unlockWriters()
{
    pthread_mutex_lock(&lock_);
    {
        writersActive_ = 0;
        if (writersWaiting_)
            pthread_cond_signal(&write_);
        else if (readersWaiting_)
            pthread_cond_broadcast(&read_);
    }
    pthread_mutex_unlock(&lock_);
}

线程是有趣的-他们也使我的大脑受伤。如果我错了,请不要直接给出答案,而是引导我正确的方向,因为这是一个家庭作业,我和其他像我一样的人肯定会从我们自己的解决方案中受益。

你的代码都不对。一旦获得读锁,就必须立即释放互斥锁。当持有互斥锁时,您需要安排阻塞写入器。当释放读锁时,如果最后一个读锁正在释放,您需要安排解除对写器的阻塞。

在伪代码:

read_lock:
1)获取互斥锁
2)增加读锁计数。
3)阻塞条件变量,直到没有写入器。
4)释放互斥锁

read_unlock:
1)获取互斥锁
2)递减读锁计数
3)如果读锁计数为零,唤醒写器。
4)释放互斥锁

write_lock:
1)获取互斥锁
2)如果使用写器优先级,请安排没有新的读器。
3)阻塞条件变量,直到没有活动读取器。(你需要阻止释放互斥锁,否则没有读取器可以完成他们的解锁操作!)

write_unlock:
1)唤醒等待的读/写(这取决于你正在实现的优先级)
2)释放互斥锁

提示一下,我不认为

    // If I'm the last reader, we can let the writers work.
if (--numberOfReadersActive_)
    pthread_cond_signal(&readersActive_);

正在做它在注释中所说的事情。这也可能是导致死锁的原因。