面试题答案
一键面试可能出现的问题
- 竞态条件:由于
sharedVariable
是共享资源,一个线程修改它,另一个线程检查它,在修改和检查之间可能存在时间窗口,导致检查结果不准确。例如,修改线程刚把sharedVariable
设为大于0,在检查线程执行assert
前,另一个修改线程又把它设为小于0 ,这样assert
可能会误判。 - 死锁:如果为了保护
sharedVariable
使用互斥锁等同步机制,在使用不当的情况下,比如两个线程相互等待对方释放锁,就可能导致死锁。
避免方法
- 使用同步机制:
- 互斥锁:在修改和检查
sharedVariable
时都加锁,确保同一时间只有一个线程能访问它。示例代码如下:
- 互斥锁:在修改和检查
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx;
int sharedVariable = 0;
void modifyThread() {
std::lock_guard<std::mutex> lock(mtx);
sharedVariable = 1;
}
void checkThread() {
std::lock_guard<std::mutex> lock(mtx);
assert(sharedVariable > 0);
}
int main() {
std::thread t1(modifyThread);
std::thread t2(checkThread);
t1.join();
t2.join();
return 0;
}
- **条件变量**:当`sharedVariable`满足条件时,通过条件变量通知检查线程,避免无效的`assert`检查。
2. 原子操作:如果sharedVariable
的操作简单,使用原子类型std::atomic<int>
,它提供了原子操作,无需使用锁就能保证操作的原子性,避免竞态条件。示例代码如下:
#include <iostream>
#include <thread>
#include <atomic>
std::atomic<int> sharedVariable(0);
void modifyThread() {
sharedVariable = 1;
}
void checkThread() {
assert(sharedVariable.load() > 0);
}
int main() {
std::thread t1(modifyThread);
std::thread t2(checkThread);
t1.join();
t2.join();
return 0;
}