在这种情况下,我应该使用lock_guard、scoped_lock还是unique_lock?
在这个代码中,有一个类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]; } };
在修改后的代码中,每个数组元素都有一个对应的互斥锁,确保每个线程只锁住自己要访问的数组元素。这样可以避免其他线程的阻塞,提高了代码的效率。