首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >boost锁互斥锁

boost锁互斥锁
EN

Stack Overflow用户
提问于 2015-03-19 19:16:30
回答 1查看 222关注 0票数 1

我有使用boost锁定机制来保护的代码。问题是,RecomputeStuff不仅可以从RemoveStuff调用,也可以从另一个线程调用。--我的问题是,使用这些boost锁定机制,修复RecomputeStuff的正确方法是什么?它现在的状态是死死的。

代码语言:javascript
复制
#include <boost/thread.hpp>

boost::shared_mutex values_mutex;

int globaldata;

class A
{
public:
    void RecomputeStuff();
    void RemoveStuff();
private:
    std::vector<std::string> data;
};

//Note, RecomputeStuff just reads from std::vector<std::string> data, but it also writes to other global stuff that RemoveStuff also writes to.
void A::RecomputeStuff()
{
    boost::upgrade_lock<boost::shared_mutex> lock(values_mutex);
    boost::upgrade_to_unique_lock<boost::shared_mutex>  unique_lock(lock);

    // this function reads std::vector<std::string> data
    // but also modifies `globaldata` that RemoveStuff also modifies.
}

void A::RemoveStuff()
{
    boost::upgrade_lock<boost::shared_mutex> lock(values_mutex);
    boost::upgrade_to_unique_lock<boost::shared_mutex>  unique_lock(lock);

    //here, remove stuff from std::vector<std::string> data
    //...then call RecomputeStuff

    RecomputeStuff();

    // modify `globaldata`
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-20 08:14:44

解决方案之一是将A::RecomputeStuff方法的未锁定代码移动到单独的代码,并从A::RemoveStuffA::RecomputeStuff调用它。见下面的代码

代码语言:javascript
复制
boost::shared_mutex values_mutex;

int globaldata;

class A
{
private:
    void RecomputeStuffUnsafe();
public:
    void RecomputeStuff();
    void RemoveStuff();
private:
    std::vector<std::string> data;
};

void A::RecomputeStuffUnsafe()
{
    // this function reads std::vector<std::string> data
    // but also modifies `globaldata` that RemoveStuff also modifies.
}


//Note, RecomputeStuff just reads from std::vector<std::string> data, but it also writes to other global stuff that RemoveStuff also writes to.
void A::RecomputeStuff()
{
    boost::upgrade_lock<boost::shared_mutex> lock(values_mutex);
    boost::upgrade_to_unique_lock<boost::shared_mutex>  unique_lock(lock);

    RecomputeStuffUnsafe();
}

void A::RemoveStuff()
{
    boost::upgrade_lock<boost::shared_mutex> lock(values_mutex);
    boost::upgrade_to_unique_lock<boost::shared_mutex>  unique_lock(lock);

    //here, remove stuff from std::vector<std::string> data
    //...then call RecomputeStuff

    RecomputeStuffUnsafe();

    // modify `globaldata`
}

编辑#00:

此外,upgrade_lock有一个接受T标记的构造函数。看起来你想要的是什么。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29153149

复制
相关文章

相似问题

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