首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用条件写入器提升shared_mutex

使用条件写入器提升shared_mutex
EN

Stack Overflow用户
提问于 2012-01-20 02:44:00
回答 1查看 631关注 0票数 0

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

问题出在if(condition)语句上,因为这可能会被多个线程评估为真,导致它们都试图成为写入者,即使数据只需要写一次。

代码语言:javascript
复制
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_;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-09 23:38:38

所以我让它以一种可以接受的方式工作。基本上,如果需要写操作,我会释放共享锁,然后写函数将获得唯一锁。在write函数中获得唯一锁之后,它再次检查以确保仍需要执行write操作来处理多个线程认为它们需要写入数据的情况。

我知道这并不理想,因为当只有一个线程需要唯一锁时,在多线程中等待唯一锁所花费的时间很长。但是,就目前而言,性能已经足够好了,并且比以前有了很大的改进。

代码语言:javascript
复制
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_;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8931519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档