MST

星途 面试题库

面试题:C++类成员函数作为回调函数与多线程场景

在多线程环境下,将C++类成员函数作为回调函数使用时,可能会遇到哪些问题?如何解决这些问题?请结合具体代码示例阐述,示例需展示多线程创建、类成员函数作为回调函数在不同线程中的调用情况。
43.4万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

可能遇到的问题

  1. 对象生命周期管理问题:如果回调函数所绑定的对象在回调函数执行之前被销毁,会导致悬空指针,引发未定义行为。
  2. 线程安全问题:类成员函数可能访问类的成员变量,如果多个线程同时调用该成员函数,对成员变量的访问可能会导致数据竞争,破坏数据的一致性。

解决方法

  1. 对象生命周期管理:确保对象的生命周期足够长,在所有可能的回调执行完毕后再销毁。可以使用智能指针来管理对象的生命周期。
  2. 线程安全:使用互斥锁(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的安全访问。