面试题答案
一键面试-
是否存在线程安全问题: 会有线程安全问题。当多个线程同时调用
modifyData
函数时,由于data = newVal;
这一操作并非原子操作,可能会出现一个线程在读取data
旧值后,还未完成赋值操作时,另一个线程也读取了data
的旧值,从而导致最终data
的值并非预期结果。 -
解决方法及原理: 可以使用互斥锁(
std::mutex
)来解决。互斥锁的原理是在同一时间只允许一个线程进入临界区(即modifyData
函数中对data
操作的部分),从而保证数据的一致性。当一个线程获取了互斥锁,其他线程就必须等待该线程释放互斥锁后才能获取并进入临界区。 -
示例代码:
#include <iostream>
#include <mutex>
class MyClass {
private:
int data;
std::mutex mtx;
public:
MyClass() : data(0) {}
void modifyData(int newVal) {
std::lock_guard<std::mutex> lock(mtx);
data = newVal;
}
int getData() const {
std::lock_guard<std::mutex> lock(mtx);
return data;
}
};
在上述代码中,modifyData
函数使用 std::lock_guard<std::mutex>
来自动管理互斥锁的加锁和解锁。当 lock_guard
对象创建时,会自动获取互斥锁 mtx
,在函数结束时,lock_guard
对象析构,自动释放互斥锁。如果还需要读取 data
的值,在 getData
函数中同样使用 std::lock_guard<std::mutex>
来保证线程安全。