我被分配使用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)释放互斥锁。

10-08 08:15