使用条件写入程序提升shared_mutex

Boost shared_mutex with Conditional Writers

本文关键字:shared mutex 程序 条件      更新时间:2023-10-16

我正在尝试编写一个类,该类允许多个读取器或仅一个写入器访问数据。问题是,读者可以有条件地成为作者,我想确保无论有多少线程想成为作者,都只允许一个线程成为作者,其他线程等待作者完成并改回读者。

问题出在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_;
}