面试题答案
一键面试- 常见问题
- 数据竞争:多个线程同时访问和修改全局变量时,可能导致数据不一致。例如:
#include <iostream>
#include <thread>
int globalVar = 0;
void increment() {
for (int i = 0; i < 10000; ++i) {
globalVar++;
}
}
int main() {
std::thread t1(increment);
std::thread t2(increment);
t1.join();
t2.join();
std::cout << "Expected: 20000, Actual: " << globalVar << std::endl;
return 0;
}
- **初始化顺序问题**:全局变量的初始化顺序在多线程环境下可能难以控制,如果一个线程依赖另一个全局变量在初始化后才能正确执行,可能出现问题。
2. 解决方法 - 使用互斥锁(Mutex):通过互斥锁来保护对全局变量的访问,确保同一时间只有一个线程能修改全局变量。例如:
#include <iostream>
#include <thread>
#include <mutex>
std::mutex globalMutex;
int globalVar = 0;
void increment() {
for (int i = 0; i < 10000; ++i) {
std::lock_guard<std::mutex> lock(globalMutex);
globalVar++;
}
}
int main() {
std::thread t1(increment);
std::thread t2(increment);
t1.join();
t2.join();
std::cout << "Expected: 20000, Actual: " << globalVar << std::endl;
return 0;
}
在上述代码中,std::lock_guard
在构造时自动锁定互斥锁,在析构时自动解锁,从而保证了对globalVar
的安全访问。