读写多线程中的读者首选和作家首选 [英] Reader Preferred and Writer Preferred in Read-Write Multithreading
问题描述
我被分配使用POSIX线程编写读写实现.我想知道两种情况下我的实现是否正确:
I was given the assignment to write a Read-Write implementation using POSIX threads. I would like to know if my implementation is correct for both cases:
已删除可怕的尝试
尝试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_);
}
线程很有趣-它们也使我的大脑受伤.如果我错了,请不要给出直接的答案,但要以正确的方向指导我,因为这是一项家庭作业,而且我以及其他与我一样的人一定会从我们自己的解决方案中受益.
Threads are fun- they also make my brain hurt. If I'm wrong, please refrain from giving a direct answer, but guide me in the right direction as this is a homework assignment and I, and other people like me, would surely benefit from getting the solution on our own.
推荐答案
通过提示的方式,我不认为
By way of hint, I don't think
// If I'm the last reader, we can let the writers work.
if (--numberOfReadersActive_)
pthread_cond_signal(&readersActive_);
正在按照评论中的内容进行操作.这也可能就是您陷入僵局的原因.
is doing what it says in the comment. This might also be why you are getting a deadlock.
这篇关于读写多线程中的读者首选和作家首选的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!