面试题答案
一键面试1. static函数在多线程环境下潜在的线程安全问题
- 共享资源竞争:当多个线程同时调用
static
函数时,如果函数内部使用了共享资源(如全局变量、静态变量等),就可能出现竞争条件。由于static
函数在整个程序中只有一份实例,多个线程同时访问和修改这些共享资源,可能导致数据不一致。 - 未同步访问:
static
函数自身并不会自动提供线程同步机制。如果多个线程同时进入static
函数并对共享资源进行读写操作,没有适当的同步手段(如互斥锁),就会引发线程安全问题。
2. 函数内部有静态局部变量可能出现的状况
- 初始化竞争:在多线程环境下,当多个线程首次调用包含静态局部变量的函数时,可能会同时尝试初始化该静态局部变量。这可能导致重复初始化,进而产生未定义行为或数据不一致。
示例代码
#include <iostream>
#include <thread>
#include <mutex>
// 互斥锁,用于线程同步
std::mutex mtx;
// 包含静态局部变量的函数
void increment() {
static int count = 0; // 静态局部变量
// 未加锁时,多线程同时访问会有问题
// count++;
// 使用互斥锁同步访问
std::lock_guard<std::mutex> lock(mtx);
count++;
std::cout << "Thread " << std::this_thread::get_id() << " count: " << count << std::endl;
}
int main() {
std::thread threads[10];
// 创建10个线程并启动
for (int i = 0; i < 10; ++i) {
threads[i] = std::thread(increment);
}
// 等待所有线程完成
for (auto& th : threads) {
th.join();
}
return 0;
}
在上述代码中,如果没有std::lock_guard<std::mutex> lock(mtx);
这部分同步代码,多个线程同时对count
进行自增操作时,就可能出现数据不一致的情况。例如,可能期望最终count
的值为10,但实际可能小于10,因为不同线程的自增操作相互干扰。通过添加互斥锁,确保了同一时间只有一个线程能访问和修改count
,从而保证了线程安全。