2011-12-20 80 views
0

我被赋予写入使用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_); 
} 

线程是乐趣,他们也让我的大脑受到伤害。如果我错了,请不要直接给出答案,而是指导我朝着正确的方向前进,因为这是一项家庭作业,我和像我这样的其他人肯定会从自己获得解决方案中受益。

回答

2

你的代码没有错。您必须在获得读锁后立即释放互斥锁。在持有互斥锁的同时,您需要安排阻止作者。释放读取锁定时,如果最后一个读取锁定正在释放,您需要安排取消锁定写入器。

在伪码:

read_lock:
1)获得互斥。
2)递增读锁定计数。
3)禁止条件变量,直到没有写入者。
4)释放互斥锁。

read_unlock:
1)获取互斥锁。
2)减少读锁计数。
3)如果读锁计数为零,唤醒编写器。
4)释放互斥锁。

write_lock:
1)获取互斥锁。
2)如果使用作家的优先级,安排没有新的读者。
3)禁止条件变量,直到没有活动的阅读器。 (您需要阻止释放互斥否则没有读者可以完成开锁操作!)

write_unlock:
1)唤醒等待读者/作者(这取决于优先要实现)
2)释放互斥。

+0

@Schwartz:它没有? D:那太糟糕了。好吧,现在最好马上让它从我的错误中吸取教训。感谢伪代码,它应该帮助我获得正确的实现。 – IAE 2011-12-21 00:06:53

+0

@Schwarz:在附注中,您能否告诉我Writer Preferred实现有什么问题?我从这个pdf教程(*)中得到的结论是,你在伪代码中描述的所有内容都是rwlock内部所做的。 (*)www.multicoreinfo.com/research/misc/Pthread-Tutorial-Peter.pdf – IAE 2011-12-21 00:09:35

+0

你不允许两个阅读器在同一时间,击败读/写锁的全部要点。 – 2011-12-21 00:14:03

2

通过暗示的方式,我不认为

// If I'm the last reader, we can let the writers work. 
if (--numberOfReadersActive_) 
    pthread_cond_signal(&readersActive_); 

是做什么的评论说。这也可能是你陷入僵局的原因。

+0

哦,废话,我现在也看到了! – IAE 2011-12-21 00:06:01