MST

星途 面试题库

面试题:C++函数返回引用在多线程环境下的生命周期管理与潜在风险

在多线程环境中,有一个函数`getSharedResourceRef`返回一个共享资源(如共享的全局变量或某个单例类成员)的引用。请分析在多线程并发访问该返回引用时可能出现的问题,从内存一致性、线程安全等角度阐述,并给出完整的线程安全实现代码示例。
28.5万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

可能出现的问题

  1. 内存一致性问题
    • 不同线程对共享资源的修改可能不会及时被其他线程看到。例如,线程A修改了共享资源的值,由于缓存一致性等问题,线程B可能在一段时间内仍然看到旧值,导致数据不一致。
  2. 线程安全问题
    • 竞态条件:多个线程同时访问和修改共享资源时,最终结果可能取决于线程执行的顺序。比如两个线程同时对共享的计数器加1操作,如果没有适当的同步机制,可能最终计数器只增加了1而不是2。

线程安全实现代码示例(以C++为例,使用互斥锁)

#include <iostream>
#include <mutex>
#include <memory>

// 模拟共享资源类
class SharedResource {
public:
    int data;
    SharedResource() : data(0) {}
};

std::mutex sharedResourceMutex;
std::unique_ptr<SharedResource> sharedResourcePtr = std::make_unique<SharedResource>();

// 获取共享资源引用的线程安全函数
SharedResource& getSharedResourceRef() {
    static std::mutex mtx;
    std::lock_guard<std::mutex> lock(mtx);
    return *sharedResourcePtr;
}

int main() {
    // 模拟多线程访问
    // 这里仅简单展示获取共享资源引用,实际应用中多线程会并发操作共享资源
    SharedResource& res1 = getSharedResourceRef();
    SharedResource& res2 = getSharedResourceRef();
    return 0;
}

代码说明

  1. 互斥锁的使用:在getSharedResourceRef函数中,使用std::mutexstd::lock_guard来确保同一时间只有一个线程能够访问和返回共享资源的引用。std::lock_guard在构造时自动锁定互斥锁,在析构时自动解锁,从而保证了线程安全。
  2. 共享资源的管理:这里使用std::unique_ptr来管理共享资源SharedResource,确保资源的正确生命周期管理。实际应用中,共享资源可能是更复杂的单例对象或全局变量等。

如果使用Java,示例如下:

class SharedResource {
    private int data;
    public SharedResource() {
        data = 0;
    }
    public int getData() {
        return data;
    }
    public void setData(int data) {
        this.data = data;
    }
}

public class ThreadSafeExample {
    private static SharedResource sharedResource = new SharedResource();
    private static final Object lock = new Object();

    public static SharedResource getSharedResourceRef() {
        synchronized(lock) {
            return sharedResource;
        }
    }

    public static void main(String[] args) {
        // 模拟多线程访问
        SharedResource res1 = getSharedResourceRef();
        SharedResource res2 = getSharedResourceRef();
    }
}

Java代码说明

  1. 同步块:在getSharedResourceRef方法中,使用synchronized关键字创建同步块,以确保同一时间只有一个线程能获取共享资源的引用,从而保证线程安全。
  2. 共享资源管理sharedResource是一个静态成员变量表示共享资源,lock是一个用于同步的对象。