私は、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-あります。私が間違っている場合は、直接的な回答を控えてください。しかし、これは宿題であるため正しい方向に導きます。私と私のような他の人たちは、私たち自身で解決策を得るのに恩恵を受けるでしょう。
@Schwartz:それはありませんか? D:まあ、それは吸う。ああ、最善を尽くすように今私は間違いから学びます。擬似コードをありがとう、それは私が正しい実装を得るのに役立つはずです。 – IAE
@Schwarz:Writer Preferred実装の問題点を教えてください。私がこのpdfチュートリアル(*)から集めたのは、あなたの擬似コードで説明したことのすべてが、rwlockが内部的に行うことです。 (*)www.multicoreinfo.com/research/misc/Pthread-Tutorial-Peter.pdf – IAE
同時に2つのリーダを許可せず、読み取り/書き込みロックの全ポイントを破棄します。 –