#include <map>
#include <string>
#include <mutex>
#include <shared_mutex>
class HighPerformanceClass {
private:
std::map<int, std::string> dataMap;
mutable std::shared_mutex mapMutex;
public:
void updateMap(int key, const std::string& value) {
std::unique_lock<std::shared_mutex> lock(mapMutex);
dataMap[key] = value;
}
std::string getValue(int key) const {
std::shared_lock<std::shared_mutex> lock(mapMutex);
auto it = dataMap.find(key);
if (it != dataMap.end()) {
return it->second;
}
return "";
}
};
设计思路
- 成员变量:使用
std::map<int, std::string>
存储数据,这是题目的要求。同时使用 std::shared_mutex
来保护 dataMap
,因为 std::shared_mutex
支持读锁(共享锁)和写锁(独占锁),适合读多写少的场景。
updateMap
函数:该函数用于更新 dataMap
中的数据,这是一个写操作,所以使用 std::unique_lock<std::shared_mutex>
获取独占锁,保证在更新数据时没有其他线程可以访问 dataMap
,从而保证数据一致性和线程安全。
getValue
函数:该函数用于读取 dataMap
中的数据,这是一个读操作,所以使用 std::shared_lock<std::shared_mutex>
获取共享锁,允许多个线程同时读取 dataMap
,提高了并发性能。
性能优化点
- 读锁共享:在
getValue
函数中使用共享锁,允许多个线程同时读取 dataMap
,减少了锁竞争,提高了读操作的并发性能。适用于读多写少的场景,因为写操作会获取独占锁,此时其他读写操作都要等待。
- 锁粒度控制:这里只对整个
dataMap
加锁,如果数据量非常大,可以考虑进一步细化锁粒度,例如对 dataMap
的部分数据加锁,但这会增加代码复杂度。在此题中,这种方式简单有效且能满足基本的性能需求。