MST

星途 面试题库

面试题:C++成员函数跨线程操作对象数据的高性能线程安全设计

设计一个C++类 `HighPerformanceClass`,该类需要支持多线程并发访问其成员数据。类中有一个成员变量 `std::map<int, std::string> dataMap`,要求实现两个成员函数 `void updateMap(int key, const std::string& value)` 和 `std::string getValue(int key)`。在多线程环境下,这两个函数要保证数据的一致性和线程安全,同时尽可能提高性能(如减少锁竞争等)。请给出完整的类设计和函数实现,并解释设计思路和性能优化点。
38.2万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#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 "";
    }
};

设计思路

  1. 成员变量:使用 std::map<int, std::string> 存储数据,这是题目的要求。同时使用 std::shared_mutex 来保护 dataMap,因为 std::shared_mutex 支持读锁(共享锁)和写锁(独占锁),适合读多写少的场景。
  2. updateMap 函数:该函数用于更新 dataMap 中的数据,这是一个写操作,所以使用 std::unique_lock<std::shared_mutex> 获取独占锁,保证在更新数据时没有其他线程可以访问 dataMap,从而保证数据一致性和线程安全。
  3. getValue 函数:该函数用于读取 dataMap 中的数据,这是一个读操作,所以使用 std::shared_lock<std::shared_mutex> 获取共享锁,允许多个线程同时读取 dataMap,提高了并发性能。

性能优化点

  1. 读锁共享:在 getValue 函数中使用共享锁,允许多个线程同时读取 dataMap,减少了锁竞争,提高了读操作的并发性能。适用于读多写少的场景,因为写操作会获取独占锁,此时其他读写操作都要等待。
  2. 锁粒度控制:这里只对整个 dataMap 加锁,如果数据量非常大,可以考虑进一步细化锁粒度,例如对 dataMap 的部分数据加锁,但这会增加代码复杂度。在此题中,这种方式简单有效且能满足基本的性能需求。