avatar
read-write locker的实现# JobHunting - 待字闺中
j*y
1
感觉是不是要有两个 counter c1 和 c2
c1 用于记录当下多少个 read 的 thread
c2用于 handle write的操作
c2有两个值0, 1
c2 = 0表示当前没有 thread 要 write
c2 = 1表示当前有 thread 想 要 write,那么这个时候想要读的thread必须 wait
当c1变成0后,也就是所有的 read threads release了这个 lock以后,那个设置 c2
为 1的 write线程就可以write了,write 完了以后就把 c2设置为0
avatar
w*x
2
class ReadWriteMutex
{
public:
ReadWriteMutex(int maxReaders = 32)
: semaphore(maxReaders)
{
}

void lockRead() { semaphore++; }
void unlockRead() { semaphore--; }
void lockWrite() {
QMutexLocker locker(&mutex);
for (int i = 0; i < maxReaders(); ++i)
semaphore++;
}
void unlockWrite() { semaphore -= semaphore.total(); }
int maxReaders() const { return semaphore.total(); }

private:
QSemaphore semaphore;
QMutex mutex;
};
avatar
p*p
3
冒出QT出来……

【在 w****x 的大作中提到】
: class ReadWriteMutex
: {
: public:
: ReadWriteMutex(int maxReaders = 32)
: : semaphore(maxReaders)
: {
: }
:
: void lockRead() { semaphore++; }
: void unlockRead() { semaphore--; }

avatar
p*p
4
啥问题
avatar
j*y
5
有 write的时候 要block read, 这个清楚
有 read的时候,如果要 write, 需要block正在read的线程吗?还是等这些
正在 read的线程 释放 read-write lock后再 write ?

class ReadWriteMutex
{
public:
ReadWriteMutex(int maxReaders = 32)
: semaphore(maxReaders)
{
}

void lockRead() { semaphore++; }
void unlockRead() { semaphore--; }
void lockWrite() {
QMutexLocker locker(&mutex);
for (int i = 0; i < maxReaders(); ++i)
semaphore++;
}
void unlockWrite() { semaphore -= semaphore.total(); }
int maxReaders() const { return semaphore.total(); }

private:
QSemaphore semaphore;
QMutex mutex;
};

【在 w****x 的大作中提到】
: class ReadWriteMutex
: {
: public:
: ReadWriteMutex(int maxReaders = 32)
: : semaphore(maxReaders)
: {
: }
:
: void lockRead() { semaphore++; }
: void unlockRead() { semaphore--; }

avatar
h*i
6
class RWMutex {
public:
RWMutex();
~RWMutex();
void read_lock();
void write_lock();
void unlock();
private:
int count_; // >0 multiple reads, <0 writer, = 0 free
int waiting_writers_;
pthread_mutex_t mutex_;
pthread_cond_t readers_;
pthread_cond_t writers_;
};
RWMutex::RWMutex() {
count_ = 0;
waiting_writers_ = 0;
pthread_mutex_init(&mutex_, NULL);
pthread_cond_init(&readers_, NULL);
pthread_cond_init(&writers_, NULL);
}
RWMutex::~RWMutex() {
pthread_mutex_destroy(&mutex_);
pthread_cond_destroy(&readers_);
pthread_cond_destroy(&writers_);
}
void
RWMutex::read_lock() {
pthread_mutex_lock(&mutex_);
while (count_ < 0 || waiting_writers_ != 0) {
pthread_cond_wait(&readers_, &mutex_);
}
++count_;
pthread_mutex_unlock(&mutex_);
}
void
RWMutex::write_lock() {
pthread_mutex_lock(&mutex_);
while (count_ != 0) {
++waiting_writers_;
pthread_cond_wait(&writers_, &mutex_);
--waiting_writers_;
}
count_ = -1;
pthread_mutex_unlock(&mutex_);
}
void
RWMutex::unlock() {
pthread_mutex_lock(&mutex_);
if (count_ > 0)
--count_;
else
count_ = 0;
if (count_ == 0) {
if (waiting_writers_ > 0)
pthread_cond_signal(&writers_);
else
pthread_cond_signal(&readers_);
}
pthread_mutex_unlock(&mutex_);
}

【在 j*****y 的大作中提到】
: 有 write的时候 要block read, 这个清楚
: 有 read的时候,如果要 write, 需要block正在read的线程吗?还是等这些
: 正在 read的线程 释放 read-write lock后再 write ?
:
: class ReadWriteMutex
: {
: public:
: ReadWriteMutex(int maxReaders = 32)
: : semaphore(maxReaders)
: {

avatar
w*a
7
boost吧
avatar
c*7
8
哪个大牛给个Java的吧
avatar
p*p
9


【在 j*****y 的大作中提到】
: 有 write的时候 要block read, 这个清楚
: 有 read的时候,如果要 write, 需要block正在read的线程吗?还是等这些
: 正在 read的线程 释放 read-write lock后再 write ?
:
: class ReadWriteMutex
: {
: public:
: ReadWriteMutex(int maxReaders = 32)
: : semaphore(maxReaders)
: {

avatar
s*x
10
这个 unlock 好像 favor writes, 可能会导致 reader thread hunger 现象。

【在 h***i 的大作中提到】
: class RWMutex {
: public:
: RWMutex();
: ~RWMutex();
: void read_lock();
: void write_lock();
: void unlock();
: private:
: int count_; // >0 multiple reads, <0 writer, = 0 free
: int waiting_writers_;

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。