面试题答案
一键面试实现 incrementData
函数
#include <mutex>
class ThreadSafeClass {
private:
int sharedData;
std::mutex dataMutex;
public:
ThreadSafeClass() : sharedData(0) {}
void incrementData() {
std::lock_guard<std::mutex> lock(dataMutex);
sharedData++;
}
};
this
指针在多线程场景下区分对象数据所面临的挑战及应对策略
挑战
- 数据竞争:在多线程环境下,多个线程可能同时调用
incrementData
函数,由于不同线程可能同时访问和修改sharedData
,会导致数据不一致问题。例如,线程A读取sharedData
的值为10,线程B也读取了值10,然后线程A将其增加到11,线程B也将其增加到11,而不是预期的12。 - 对象混淆:如果有多个
ThreadSafeClass
对象,this
指针需要明确指向当前操作的对象。但在多线程环境下,可能出现线程在操作对象过程中,由于上下文切换,另一个线程开始操作不同对象的sharedData
,导致数据错误。
应对策略
- 使用互斥锁:如上述代码中,通过
std::mutex
和std::lock_guard
来保证在任何时刻只有一个线程能够访问和修改sharedData
。std::lock_guard
在构造时自动锁定互斥锁,在析构时自动解锁,从而避免手动管理锁的生命周期可能出现的错误。 - 基于
this
指针的锁定:在上述实现中,虽然没有直接利用this
指针进行锁定,但实际上dataMutex
是属于每个ThreadSafeClass
对象的,因此当不同线程调用不同对象的incrementData
函数时,各自的dataMutex
可以保证对各自对象的sharedData
进行正确的同步操作。这就间接利用了this
指针来区分不同对象的数据,确保每个线程操作的是正确对象的sharedData
。
通过以上策略,可以有效解决 this
指针在多线程场景下区分对象数据所面临的挑战,保证线程安全。