在这种情况下,我应该使用lock_guard,scoped_lock还是unique_lock吗?

我已经阅读了许多与此相关的问题,但是没有一个问题让我清楚地了解到当我有多个作者但只有一个读者时应该使用哪个问题。下面的代码是我所谈论的人为设计的示例。

struct StateInfo {
    long wd{};
    uint32_t perc{};
};

class Blah 
{
    const int numDevices = getDevices();
    std::shared_mutex sharedMutexSI_;
    vector<StateInfo> stateInfo;
public:

    Blah() : stateInfo(numDevices){};

    void writers(StateInfo &newSi,const int i)
    {
        std::shared_lock<std::shared_mutex> _MULTIPLE(sharedMutexSI_);
        stateInfo[i] = newSi;
    }

    StateInfo reader(const int i)
    {
        std::lock_guard<std::shared_mutex> _EXCLUSIVE(sharedMutexSI_);
        return stateInfo[i];
    }
};

这种情况是,多个编写器可能会同时更新stateInfo向量,但是向量中与i相同的项永远不会对每个线程唯一。单个读取器线程可以随时尝试读取任何矢量项。

  1. 以上代码在避免出现竞争情况时是否正确?

  2. lock_guard是正确的选择还是应该使用scoped_lockunique_lock

iCMS 回答:在这种情况下,我应该使用lock_guard,scoped_lock还是unique_lock吗?

总结评论中已经写的内容:

是,代码正确。但是,它可能效率不高,因为它不允许在写入另一个数组元素时从任何数组元素进行读取。您可能希望通过对每个数组元素使用mutex来进行更细粒度的同步。

class Blah 
{
    const int numDevices = getDevices();
    std::vector<std::mutex> mutexes;
    std::vector<StateInfo> stateInfo;
public:

    Blah() : mutexes(numDevices),stateInfo(numDevices){}

    void writers(StateInfo &newSi,const int i)
    {
        std::lock_guard<std::mutex> guard(mutexes[i]);
        stateInfo[i] = newSi;
    }

    StateInfo reader(const int i)
    {
        std::lock_guard<std::mutex> guard(mutexes[i]);
        return stateInfo[i];
    }
};
本文链接:https://www.f2er.com/1867457.html

大家都在问