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

8 浏览
0 Comments

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

我已经阅读了很多与此相关的已解答的问题,但没有一个给我明确的理解,关于在有多个写者但只有一个读者时,我应该使用哪个。下面的代码是一个人为的例子,用于说明我的问题。\n这种情况下,多个写者可能同时更新stateInfo向量,但永远不会更新向量中的同一项,因为i在每个线程中是唯一的。单个读者线程可以在任何时候尝试读取向量的任何项。\n1. 上述代码在避免竞争条件方面是否正确?\n2. 应该使用lock_guard还是scoped_lock或unique_lock?

0
0 Comments

在这个代码中,有一个类Blah,其中包含两个vector,一个用于存储互斥锁(mutexes),另一个用于存储状态信息(stateInfo)。类中有两个方法,一个用于写入状态信息(writers),另一个用于读取状态信息(reader)。

问题的出现原因是代码在写入状态信息时使用了lock_guard,而在读取状态信息时也使用了lock_guard。这样做的问题是,当一个线程正在写入一个数组元素时,其他线程无法读取任何数组元素,导致效率低下。

解决方法是使用更细粒度的同步控制。可以为每个数组元素使用一个互斥锁,这样每个线程只需要锁住自己要读取或写入的数组元素,而不会阻塞其他线程对其他数组元素的访问。

下面是修改后的代码示例:

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];
    }
};

在修改后的代码中,每个数组元素都有一个对应的互斥锁,确保每个线程只锁住自己要访问的数组元素。这样可以避免其他线程的阻塞,提高了代码的效率。

0