【发布时间】:2012-08-15 12:27:47
【问题描述】:
我有一组数据结构需要用读/写锁来保护。我知道 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 内核上运行。
能否请您给我看(伪代码可以)读/写锁?我现在拥有的应该是防止作家饥饿的变体。到目前为止,我的主要问题是 read_lock 在检查读取是否安全与实际增加读取器计数之间存在差距,之后 write_lock 知道等待。
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;
}
我对多线程有点陌生,我真的很想了解它。提前感谢您的帮助!
【问题讨论】:
-
open-std.org/jtc1/sc22/wg21/docs/papers/2007/… 给出了 shared_mutex/upgrade_mutex 作为读写锁的参考实现。
-
问题是关于如何自己实现它,但是如果您可以使用 C++14 或更高版本并且更喜欢使用 C++ 标准中现有的读/写锁,请参阅此问题: stackoverflow.com/q/31622059/783510(“如何在 C++14 中实现读写锁”)
标签: c++ multithreading c++11 locking readwritelock