c++ - Read-Write 多线程中的 Reader Preferred 和 Writer Preferred

标签 c++ multithreading posix

我的任务是使用 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_);
}

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

最佳答案

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

在伪代码中:

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

读取解锁:
1) 获取互斥量。
2) 减少读锁计数。
3) 如果读取锁定计数为零,则唤醒写入器。
4) 释放互斥。

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

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

关于c++ - Read-Write 多线程中的 Reader Preferred 和 Writer Preferred,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8583487/

相关文章:

c# - Parallel.ForEach仅在未运行代码时才在启动时执行两次吗?

c++ - 通过覆盖 C 标准库调用来测量堆使用情况

c++ - 为什么在两个不同的类中调用 TinyXPath 时,同一对象会给出不同的结果?

c++ - 返回通过引用分配的引用局部变量

c++ - "STL"和 "C++ Standard Library"有什么区别?

java多线程

C# 通用存储库 - 工作单元 - 线程安全

c - 为什么 sem_open 不为相同的名称返回相同的值?

c++ - 从共享对象调用主可执行文件中的函数

无法从打开的文件中读取