我被赋予写入使用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_);
}
线程是乐趣,他们也让我的大脑受到伤害。如果我错了,请不要直接给出答案,而是指导我朝着正确的方向前进,因为这是一项家庭作业,我和像我这样的其他人肯定会从自己获得解决方案中受益。
@Schwartz:它没有? D:那太糟糕了。好吧,现在最好马上让它从我的错误中吸取教训。感谢伪代码,它应该帮助我获得正确的实现。 – IAE 2011-12-21 00:06:53
@Schwarz:在附注中,您能否告诉我Writer Preferred实现有什么问题?我从这个pdf教程(*)中得到的结论是,你在伪代码中描述的所有内容都是rwlock内部所做的。 (*)www.multicoreinfo.com/research/misc/Pthread-Tutorial-Peter.pdf – IAE 2011-12-21 00:09:35
你不允许两个阅读器在同一时间,击败读/写锁的全部要点。 – 2011-12-21 00:14:03