2011-12-20 14 views
0

私は、POSIXスレッドを使用して読み取りと書き込みの実装を書くという割り当てを与えられました。私は私の実装は両方のケースのために正しいかどうかを知りたい:読み取りと書き込みのマルチスレッドで優先と優先のライター

変数::

好適

試行数2

Readerが消去され

恐ろしい試み

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_); 
} 

スレッドが、彼らはまた、私の脳を傷つけるを作るfun-あります。私が間違っている場合は、直接的な回答を控えてください。しかし、これは宿題であるため正しい方向に導きます。私と私のような他の人たちは、私たち自身で解決策を得るのに恩恵を受けるでしょう。

答えて

2

あなたのコードはありません。読み込みロックを取得するとすぐにmutexを解放する必要があります。ミューテックスを保持している間、ライターをブロックするように手配する必要があります。読み取りロックを解除しているときに、最後の読み取りロックが解除されている場合は、書き込みを解除する必要があります。擬似コードで

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

+0

@Schwarz:Writer Preferred実装の問題点を教えてください。私がこのpdfチュートリアル(*)から集めたのは、あなたの擬似コードで説明したことのすべてが、rwlockが内部的に行うことです。 (*)www.multicoreinfo.com/research/misc/Pthread-Tutorial-Peter.pdf – IAE

+0

同時に2つのリーダを許可せず、読み取り/書き込みロックの全ポイントを破棄します。 –

2


はヒントとして、私は

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

は、それがコメントで言ってやっているとは思いません。これはまた、あなたがデッドロックを起こしている理由かもしれません。

+0

ああ、私は今でもそれを参照してください! – IAE

関連する問題