MST

星途 面试题库

面试题:网络编程中C++多线程处理网络连接的问题

在C++网络编程中,使用多线程处理多个网络连接时,如何确保线程安全地访问共享资源,例如全局的连接池?请描述一种实现思路并给出关键代码片段。
20.0万 热度难度
后端开发网络编程

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 互斥锁(Mutex):使用互斥锁来保护共享资源。在访问共享资源(如连接池)前,线程先获取互斥锁,访问结束后释放互斥锁。这样可以保证同一时间只有一个线程能访问共享资源。
  2. 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;
}

在上述代码中:

  1. ConnectionPool类包含一个std::mutex成员变量mutex_,用于保护连接池的访问。
  2. getConnection函数使用std::unique_lock<std::mutex>来获取和管理锁。std::unique_lock利用RAII机制,在其构造函数中获取锁,在析构函数中释放锁。
  3. main函数创建了多个线程,每个线程都调用globalPool.getConnection(),演示了多线程安全访问共享连接池的过程。