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