MST

星途 面试题库

面试题:C++ const成员函数与共享资源的线程安全

假设你有一个C++类,其中包含一个const成员函数,该函数访问并操作类内的共享资源(例如静态成员变量)。请描述如何在保证函数const特性的同时确保线程安全,给出具体的代码示例(可使用C++11及以上特性),并分析该实现的优缺点。
39.4万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

实现方法

  1. 使用std::mutex:在C++中,可以使用std::mutex来保护共享资源。在const成员函数中,对共享资源的访问和操作前后加锁和解锁,以确保线程安全。
#include <iostream>
#include <mutex>

class MyClass {
private:
    static int sharedResource;
    static std::mutex mtx;
public:
    const int accessSharedResource() const {
        std::lock_guard<std::mutex> lock(mtx);
        // 访问和操作共享资源
        ++sharedResource;
        return sharedResource;
    }
};

int MyClass::sharedResource = 0;
std::mutex MyClass::mtx;
  1. 使用std::shared_mutex(C++17及以上):如果共享资源的读取操作远多于写入操作,可以使用std::shared_mutex来提高性能。读操作使用std::shared_lock,写操作使用std::unique_lock
#include <iostream>
#include <shared_mutex>

class MyClass {
private:
    static int sharedResource;
    static std::shared_mutex mtx;
public:
    const int readSharedResource() const {
        std::shared_lock<std::shared_mutex> lock(mtx);
        return sharedResource;
    }
    int modifySharedResource() {
        std::unique_lock<std::shared_mutex> lock(mtx);
        ++sharedResource;
        return sharedResource;
    }
};

int MyClass::sharedResource = 0;
std::shared_mutex MyClass::mtx;

优缺点分析

  1. 使用std::mutex的优缺点
    • 优点
      • 简单直接:实现方式简单,容易理解和维护,适用于各种场景。
      • 通用性强:能有效保护共享资源,防止多线程竞争条件。
    • 缺点
      • 性能瓶颈:如果多个线程频繁访问共享资源,由于每次访问都需要加锁解锁,会导致性能下降,特别是在高并发场景下。
  2. 使用std::shared_mutex的优缺点
    • 优点
      • 读性能提升:对于读多写少的场景,允许多个线程同时进行读操作,大大提高了并发性能。
    • 缺点
      • 复杂性增加:代码实现相对复杂,需要区分读操作和写操作,对开发者要求更高。
      • 写操作开销:写操作仍然需要独占锁,在写操作频繁时,可能会导致读操作等待,性能反而不如std::mutex