面试题答案
一键面试潜在问题
- 线程安全问题:在多线程环境下,多个线程可能同时访问并初始化局部静态变量,导致重复初始化或数据竞争问题,使得程序的行为变得不可预测。
解决方案
- 使用互斥锁(Mutex):通过互斥锁来保护局部静态变量的初始化过程,确保同一时间只有一个线程能够进行初始化操作。
以下是C++ 代码示例:
#include <iostream>
#include <mutex>
std::mutex mtx;
class Singleton {
public:
static Singleton& getInstance() {
static std::once_flag flag;
static Singleton instance;
std::call_once(flag, [] {
std::cout << "Initializing Singleton" << std::endl;
});
return instance;
}
private:
Singleton() = default;
~Singleton() = default;
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
};
int main() {
auto& s1 = Singleton::getInstance();
auto& s2 = Singleton::getInstance();
return 0;
}
在上述代码中,std::call_once
配合 std::once_flag
确保 instance
只被初始化一次,从而避免了多线程环境下局部静态变量的重复初始化问题。
- C++11 及以后的线程安全局部静态变量:C++11 标准规定局部静态变量的初始化是线程安全的,编译器会自动处理初始化过程中的线程安全问题。所以在支持 C++11 的编译器环境下,直接使用局部静态变量即可,无需额外同步机制。如上面代码中在C++11环境下
getInstance
函数里的instance
变量的初始化是线程安全的。