读写多线程中的读优先和写优先
Reader Preferred and Writer Preferred in Read-Write Multithreading
我被分配使用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_);
}
线程是有趣的-他们也使我的大脑受伤。如果我错了,请不要直接给出答案,而是引导我正确的方向,因为这是一个家庭作业,我和其他像我一样的人肯定会从我们自己的解决方案中受益。
你的代码都不对。一旦获得读锁,就必须立即释放互斥锁。当持有互斥锁时,您需要安排阻塞写入器。当释放读锁时,如果最后一个读锁正在释放,您需要安排解除对写器的阻塞。
在伪代码: read_lock:
1)获取互斥锁
2)增加读锁计数。
3)阻塞条件变量,直到没有写入器。
4)释放互斥锁
read_unlock:
1)获取互斥锁
2)递减读锁计数
3)如果读锁计数为零,唤醒写器。
4)释放互斥锁
write_lock:
1)获取互斥锁
2)如果使用写器优先级,请安排没有新的读器。
3)阻塞条件变量,直到没有活动读取器。(你需要阻止释放互斥锁,否则没有读取器可以完成他们的解锁操作!)
write_unlock:
1)唤醒等待的读/写(这取决于你正在实现的优先级)
2)释放互斥锁
提示一下,我不认为
// If I'm the last reader, we can let the writers work.
if (--numberOfReadersActive_)
pthread_cond_signal(&readersActive_);
正在做它在注释中所说的事情。这也可能是导致死锁的原因。
相关文章:
- 多线程一读一写time_t
- SQLite - C++中的多线程读写
- 在C++中使用多线程时,是否可以读取半写的、损坏的原始变量?
- 线程读锁定与写锁定
- 线程读写锁定问题
- 具有对齐 int 的多线程读写
- 矢量复制和多线程 :即使偶尔发生写入,如何确保多读
- 为什么开发人员在多线程代码的读/写过程中锁定字长数据
- 在多线程环境(C++)中读/写文件的最佳方式
- 在多线程应用程序中读写自定义映射时堆损坏
- 读写多线程中的读优先和写优先
- 一个线程读一个线程写,std::deque是安全的
- 为多线程程序增强非阻塞读写例程
- c++中读写文件的多线程
- 具有独立读线程和写线程的单个队列是否需要锁定
- map在多线程程序中的读/写和删除
- 对稀疏阵列的高效多线程写访问
- boost::asio多线程异步接受,带有阻塞读/写服务器
- vector多线程同步,一个读一个写:只在调整大小时锁定
- 如果一个且只有一个线程被停止,可以从多线程进程中跟踪读/写数据