面试题答案
一键面试实现思路
- 互斥锁(Mutex):使用互斥锁来保护共享资源。在访问共享资源(如连接池)前,线程先获取互斥锁,访问结束后释放互斥锁。这样可以保证同一时间只有一个线程能访问共享资源。
- RAII(Resource Acquisition Is Initialization):利用C++ 的RAII机制,将互斥锁的获取和释放封装在一个类中,确保在对象生命周期结束时自动释放锁,防止忘记释放锁导致死锁。
关键代码片段
#include <iostream>
#include <thread>
#include <mutex>
#include <vector>
// 模拟连接池
class ConnectionPool {
public:
// 获取连接
void getConnection() {
std::unique_lock<std::mutex> lock(mutex_);
std::cout << "Thread " << std::this_thread::get_id() << " gets connection from pool." << std::endl;
}
private:
std::mutex mutex_;
};
// 全局连接池对象
ConnectionPool globalPool;
// 线程执行函数
void threadFunction() {
globalPool.getConnection();
}
int main() {
std::vector<std::thread> threads;
// 创建多个线程
for (int i = 0; i < 5; ++i) {
threads.emplace_back(threadFunction);
}
// 等待所有线程结束
for (auto& thread : threads) {
thread.join();
}
return 0;
}
在上述代码中:
ConnectionPool
类包含一个std::mutex
成员变量mutex_
,用于保护连接池的访问。getConnection
函数使用std::unique_lock<std::mutex>
来获取和管理锁。std::unique_lock
利用RAII机制,在其构造函数中获取锁,在析构函数中释放锁。main
函数创建了多个线程,每个线程都调用globalPool.getConnection()
,演示了多线程安全访问共享连接池的过程。