MST

星途 面试题库

面试题:C++ 类内成员函数在多线程环境下对静态成员的正确使用

考虑一个多线程环境,有一个 `Worker` 类,类中有一个静态成员变量 `sharedData` 以及一个成员函数 `updateSharedData` 用于更新这个静态成员变量。请设计代码确保在多线程并发调用 `updateSharedData` 函数时,`sharedData` 的更新是线程安全的,描述你的设计思路并给出相应代码实现(可使用 C++ 标准库中的多线程相关工具)。
25.8万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 使用互斥锁(std::mutex)来保护对静态成员变量 sharedData 的访问。在进入 updateSharedData 函数时,锁定互斥锁,离开函数时解锁,这样可以防止多个线程同时访问和修改 sharedData
  2. 为了简化锁的管理,使用 std::lock_guardstd::unique_lock 来自动管理锁的生命周期,避免手动忘记解锁的风险。

代码实现

#include <iostream>
#include <mutex>
#include <thread>

class Worker {
public:
    static int sharedData;
    static std::mutex mtx;

    void updateSharedData(int value) {
        std::lock_guard<std::mutex> lock(mtx);
        sharedData += value;
    }
};

int Worker::sharedData = 0;
std::mutex Worker::mtx;

void workerFunction(Worker& worker, int value) {
    worker.updateSharedData(value);
}

int main() {
    Worker worker;
    std::thread t1(workerFunction, std::ref(worker), 10);
    std::thread t2(workerFunction, std::ref(worker), 20);

    t1.join();
    t2.join();

    std::cout << "Final sharedData value: " << Worker::sharedData << std::endl;
    return 0;
}