面试题答案
一键面试可能遇到的问题
- 对象生命周期管理问题:如果回调函数所绑定的对象在回调函数执行之前被销毁,会导致悬空指针,引发未定义行为。
- 线程安全问题:类成员函数可能访问类的成员变量,如果多个线程同时调用该成员函数,对成员变量的访问可能会导致数据竞争,破坏数据的一致性。
解决方法
- 对象生命周期管理:确保对象的生命周期足够长,在所有可能的回调执行完毕后再销毁。可以使用智能指针来管理对象的生命周期。
- 线程安全:使用互斥锁(
std::mutex
)等同步机制来保护对共享成员变量的访问。
代码示例
#include <iostream>
#include <thread>
#include <mutex>
#include <memory>
class MyClass {
public:
MyClass() : value(0) {}
void callbackFunction() {
std::lock_guard<std::mutex> lock(mutex_);
++value;
std::cout << "Thread " << std::this_thread::get_id() << " calls callbackFunction, value = " << value << std::endl;
}
private:
int value;
std::mutex mutex_;
};
void threadFunction(std::shared_ptr<MyClass> obj) {
obj->callbackFunction();
}
int main() {
std::shared_ptr<MyClass> myObj = std::make_shared<MyClass>();
std::thread thread1(threadFunction, myObj);
std::thread thread2(threadFunction, myObj);
thread1.join();
thread2.join();
return 0;
}
在上述代码中:
MyClass
类包含一个成员变量value
和一个互斥锁mutex_
。callbackFunction
函数使用std::lock_guard
来锁定互斥锁,确保对value
的操作是线程安全的。threadFunction
是线程执行的函数,它接收一个std::shared_ptr<MyClass>
类型的对象指针,并调用其callbackFunction
成员函数。- 在
main
函数中,创建了一个MyClass
对象的std::shared_ptr
,并启动两个线程来调用callbackFunction
。通过std::shared_ptr
管理对象的生命周期,避免了对象提前销毁的问题。同时,std::mutex
保证了多线程环境下对成员变量value
的安全访问。