【发布时间】:2015-05-05 04:35:48
【问题描述】:
我目前正在使用 boost 库实现读/写锁,而不使用 shared_lock 和 unique_lock。我已经阅读了一些相关的问题(例如,How would a readers/writer lock be implemented in C++11?),但我仍然想优化实现。
这是我的代码:
enum LockType { NO_LOCK, READ_LOCK, WRITE_LOCK, INC_LOCK };
boost::mutex mutex_;
boost::condition condition_;
LockType lock_;
size_t owner_count_;
void AcquireReadLock() {
mutex_.lock();
while (lock_ != NO_LOCK && lock_ != READ_LOCK){
condition_.wait(mutex_);
}
// if there is no lock, then acquire read lock.
if (lock_ == NO_LOCK) {
lock_ = READ_LOCK;
++owner_count_;
mutex_.unlock();
return;
}
else {
// if there is read lock, then still acquire read lock.
assert(lock_ == READ_LOCK);
++owner_count_;
mutex_.unlock();
return;
}
}
void AcquireWriteLock() {
mutex_.lock();
while (lock_ != NO_LOCK){
condition_.wait(mutex_);
}
// if there is no lock, then acquire write lock.
assert(lock_ == NO_LOCK);
lock_ = WRITE_LOCK;
mutex_.unlock();
return;
}
void ReleaseReadLock() {
mutex_.lock();
--owner_count_;
if (owner_count_ == 0) {
lock_ = NO_LOCK;
}
mutex_.unlock();
// is it correct to use notify_all?
condition_.notify_all();
}
void ReleaseWriteLock() {
mutex_.lock();
lock_ = NO_LOCK;
mutex_.unlock();
// is it correct to use notify_all?
condition_.notify_all();
}
问题是:
释放锁时是否应该使用 notify_all?根据文档,一旦一个线程得到通知,它就会重新获得锁。如果使用 notify_all,则多个线程可以重新获取同一个锁。那时会发生什么?以及线程是否会在检查条件之前获取锁(即 lock_!=NO_LOCK && lock_!=READ_LOCK)?
如何优化程序?显然,当释放读锁时,我们只需要通知试图获取写锁的线程,因为读永远不会阻塞读。那么如何实现这个想法呢?
提前感谢您的帮助!
【问题讨论】:
标签: c++ multithreading boost