我有一组数据结构,需要使用读者/写者锁进行保护。我知道boost::shared_lock,但我想使用std::mutex、std::condition_variable和/或std::atomic来自定义实现,以便更好地理解它的工作原理(并稍后进行调整)。
每个数据结构(可移动,但不可复制)都将继承一个名为Commons的类,该类封装了锁定操作。我希望公共接口看起来像这样:
class Commons {
public:
void read_lock();
bool try_read_lock();
void read_unlock();
void write_lock();
bool try_write_lock();
void write_unlock();
};
...以便它可以被一些人公开继承:
class DataStructure : public Commons {};
我正在编写科学代码,一般可以避免数据竞争;这个锁主要是为了防止我以后可能犯的错误。因此,我的优先级是尽量减少读取开销,这样不会过度干扰正确运行的程序。每个线程可能都会在自己的CPU核心上运行。
请问您能否展示一个(伪代码也可以)读者/作者锁?我现在使用的是预防写入者饥饿的变体。到目前为止,我的主要问题是在检查读取是否安全并实际增加读取计数之间存在的空隙,之后写入锁就知道要等待了。
void Commons::write_lock() {
write_mutex.lock();
reading_mode.store(false);
while(readers.load() > 0) {}
}
void Commons::try_read_lock() {
if(reading_mode.load()) {
//if another thread calls write_lock here, bad things can happen
++readers;
return true;
} else return false;
}
我对多线程还比较陌生,希望能够深入了解。非常感谢您的帮助!