gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 23:27:00 34 4
gpt4 key购买 nike

我的任务是使用 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/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com