MST

星途 面试题库

面试题:C++静态存储区变量在多线程环境下的生命周期问题

在C++中,静态存储区变量的生命周期是从程序开始到结束。当处于多线程环境时,可能会出现哪些与静态存储区变量生命周期相关的问题?如何解决这些问题?
20.0万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

可能出现的问题

  1. 数据竞争:多个线程同时访问和修改静态存储区变量,会导致数据不一致,比如两个线程同时对静态计数器进行递增操作,结果可能并非预期的依次递增。
  2. 初始化顺序问题:如果静态变量依赖于其他线程初始化的资源,可能会在初始化时出现资源未准备好的情况。

解决方法

  1. 使用互斥锁:通过std::mutex对静态变量的访问进行保护。例如:
#include <iostream>
#include <mutex>

std::mutex mtx;
static int staticVariable = 0;

void increment() {
    std::lock_guard<std::mutex> lock(mtx);
    staticVariable++;
}
  1. 局部静态变量:在函数内部使用局部静态变量,C++11 之后局部静态变量的初始化是线程安全的。例如:
int getValue() {
    static int value = 0;
    return value;
}
  1. 单例模式:如果静态变量是一个单例对象,使用线程安全的单例模式。例如:
class Singleton {
public:
    static Singleton& getInstance() {
        static Singleton instance;
        return instance;
    }
private:
    Singleton() = default;
    ~Singleton() = default;
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;
};