使用条件写入程序提升shared_mutex
Boost shared_mutex with Conditional Writers
我正在尝试编写一个类,该类允许多个读取器或仅一个写入器访问数据。问题是,读者可以有条件地成为作者,我想确保无论有多少线程想成为作者,都只允许一个线程成为作者,其他线程等待作者完成并改回读者。
问题出在if(condition)
语句上,因为这可能会被多个线程评估为true,导致它们都试图成为写入程序,即使数据只需要写入一次。
class Test {
public:
int getData() {
boost::shared_lock<boost::shared_mutex> lock(access_);
if(condition) {
writeData();
}
// Do stuff
}
void writeData() {
// Get exclusive access
boost::upgrade_to_unique_lock<boost::shared_mutex> unique_lock(access_);
// Do stuff
}
private:
boost::shared_mutex access_;
}
所以我以一种可以接受的方式完成了这项工作。基本上,如果需要写,我会释放共享锁,然后写函数会得到一个唯一的锁。在获取写入函数中的唯一锁后,它会再次进行检查,以确保仍然需要写入操作来处理多个线程认为需要写入数据的情况。
我知道这并不理想,因为在多个线程中等待唯一锁的时间很长,而只有一个线程需要唯一锁。但是,目前的表现已经足够好了,与以前相比有了显著的进步。
class Test {
public:
int getData() {
boost::shared_lock<boost::shared_mutex> lock(access_);
if(need_write) {
lock.unlock();
writeData();
lock.lock();
}
// Do stuff
}
void writeData() {
// Get exclusive access
boost::unique_lock<boost::shared_mutex> unique_lock(access_);
if(need_write) {
return;
}
// Do stuff
}
private:
boost::shared_mutex access_;
}
相关文章:
- 如何在没有死锁和/或争用的情况下正确使用 std::mutex C++?
- std::mutex 如何防止线程修改?
- 引用 std::shared:ptr 以避免引用计数
- DRD 报告"conflicting load" std::mutex::lock 上的错误
- 是否需要 mutex() 来安全地同时访问具有 2 个线程的数组的不同元素?
- std::atomic 和 std::mutex 的相对性能
- 如何解决"'mutex' in namespace 'std' does not name a type"?
- std::lock_guard 怎么可能比 std::mutex::lock() 更快?
- 当"std::lock_guard<std::mutex>"对象没有名称时的不同行为
- std::mutex::lock() 产生奇怪(和不必要的)ASM 代码
- 使用 std::mutex 保护环路
- dopen():不以 root 身份运行时"failed to map segment from shared object"
- std::mutex作为一个成员变量对多个线程来说是安全的吗
- 无法使用 libtool 将 -shared 参数传递给 g++
- std::shared_timed_mutex何时比std::mutex慢,以及何时(不)使用它
- <mutex> 使用 /clr 或 /clr:pure 编译时不支持
- std::mutex 的发布-获取可见性保证是否仅适用于关键部分?
- 链接 boost 库时"Error while loading shared libraries"引发的,除了我无法使用 root 访问权限来修复它
- 解决方法:'can not be used when making a shared object; recompile with -fPIC'使用Cmake。使用普通的 g++ 工作
- 死锁使用 std::mutex 来保护多个线程中的 cout