提问者:小点点

在这种情况下,我应该使用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。 单个读取器线程可以在任何时间尝试读取任何向量项。

>

  • 上述代码在避免种族条件中是否正确?

    是使用lock_guard正确,还是应该使用scoped_lockunique_lock


  • 共1个答案

    匿名用户

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

    是的,密码是正确的。 然而,它可能效率不高,因为它不允许在写入另一个数组元素的同时读取任何数组元素。 您可能希望通过对每个数组元素使用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];
        }
    };