使用条件变量实现读写锁
class RWlock{
public:
RWlock():readers(0), writer(false){}
void acquireReadLock(){
std::unique_lock<std::mutex> lock(mutexlock);
readcondition.wait(lock, [this](){
return !writer;
});
++readers;
}
void releaseReadLock(){
std::unique_lock<std::mutex> lock(mutexlock);
--readers;
if(readers == 0){
writerCondition.notify_one();
}
}
void acquireWriteLock(){
std::unique_lock<std::mutex> lock(mutexlock);
writerCondition.wait(lock, [this](){return readers == 0;});
writer = true;
}
void releaseWriteLock(){
std::unique_lock<std::mutex> lock(mutexlock);
writer = false;
readcondition.notify_all();
writerCondition.notify_one();
}
private:
std::mutex mutexlock;
std::condition_variable readcondition;
std::condition_variable writerCondition;
int readers = 0;
bool writer = false;
};
使用两个互斥锁实现读写锁
#include<iostream>
#include <thread>
#include <mutex>
class ReadWriteLock{
public:
ReadWriteLock():readCount(0){}
void acquireReadLock(){
std::unique_lock<std::mutex> lock(readMutex);
++readCount;
if(readCount == 1){
writeMutex.lock();
}
}
void releaseReadLock(){
std::unique_lock<std::mutex> lock(readMutex);
--readCount;
if(readCount == 0){
writeMutex.unlock();
}
}
void acquireWriteLock(){
writeMutex.lock();
}
void releaseWriteLock(){
writeMutex.unlock();
}
private:
std::mutex readMutex;
std::mutex writeMutex;
int readCount;
};
实现写优先
class ReadWriteLock{
public:
ReadWriteLock():readCount(0), writeCount(0){}
void acquireReadLock(){
std::unique_lock<std::mutex> lock(mutexLock);
readCondition.wait(lock, [this](){
return writeCount == 0;
});
++readCount;
}
void releaseReadLock(){
std::unique_lock<std::mutex> lock(mutexLock);
--readCount;
if(readCount == 0){
writeCondition.notify_one();
}
}
void acquireWriteLock(){
std::unique_lock<std::mutex> lock(mutexLock);
++writeCount;
writeCondition.wait(lock, [this](){return readCount == 0 and !isWriting;});
isWriting = true;
}
void releaseWriteLock(){
std::unique_lock<std::mutex> lock(mutexLock);
--writeCount;
isWriting = false;
readCondition.notify_all();
writeCondition.notify_one();
}
private:
std::mutex mutexLock;
std::condition_variable readCondition;
std::condition_variable writeCondition;
int readCount = 0;
int writeCount = 0;
bool isWriting;
};