现代 C++ 并发服务器的核心模式

现代 C++ 并发服务器的核心模式

📁 项目结构

复制代码
concurrent-message-server/
├── CMakeLists.txt
└── src/
    └── main.cpp

📄 src/main.cpp

cpp 复制代码
// =============================================================================
// 精简并发消息服务器 - 教学版
// 特点:异步、线程安全、可扩展
// 编译: mkdir build && cd build && cmake .. && make
// 运行: ./server_demo
// =============================================================================

#include <iostream>
#include <map>
#include <functional>
#include <queue>
#include <thread>
#include <mutex>
#include <atomic>
#include <chrono>
#include <string>

using namespace std;

// ----------------------------
// 消息结构
// ----------------------------
struct Message {
    string type;
    string data;
    Message(string t = "", string d = "") : type(std::move(t)), data(std::move(d)) {}
};

using MessageHandler = function<void(const Message&)>;

// ----------------------------
// 并发消息服务器(核心)
// ----------------------------
class ConcurrentMessageServer {
private:
    // 注册表:消息类型 -> 处理函数
    map<string, MessageHandler> handlers_;

    // 消息队列(生产者-消费者缓冲区)
    queue<Message> message_queue_;
    mutable mutex queue_mutex_;

    // 控制线程生命周期
    atomic<bool> should_stop_{false};
    thread worker_thread_;

    // 后台工作线程主循环
    void worker_loop() {
        while (!should_stop_) {
            Message msg;
            {
                lock_guard<mutex> lock(queue_mutex_);
                if (message_queue_.empty()) {
                    this_thread::sleep_for(chrono::milliseconds(1));
                    continue;
                }
                msg = move(message_queue_.front());
                message_queue_.pop();
            }

            // 在无锁环境下处理消息
            auto it = handlers_.find(msg.type);
            if (it != handlers_.end()) {
                it->second(msg);
            }
        }
    }

public:
    // 注册消息处理器
    void register_handler(const string& type, MessageHandler handler) {
        handlers_[type] = move(handler);
    }

    // 异步发送消息(非阻塞)
    void send(const Message& msg) {
        lock_guard<mutex> lock(queue_mutex_);
        message_queue_.push(msg);
    }

    // 启动后台线程
    void start() {
        should_stop_ = false;
        worker_thread_ = thread(&ConcurrentMessageServer::worker_loop, this);
    }

    // 停止并等待线程结束
    void stop() {
        should_stop_ = true;
        if (worker_thread_.joinable()) {
            worker_thread_.join();
        }
    }

    ~ConcurrentMessageServer() {
        stop();
    }
};

// ----------------------------
// 演示:一个简单的 HTTP 服务器模拟
// ----------------------------
class HttpServer : public ConcurrentMessageServer {
public:
    HttpServer() {
        register_handler("GET", [](const Message& m) {
            cout << "[HTTP] GET " << m.data << "\n";
        });
        register_handler("POST", [](const Message& m) {
            cout << "[HTTP] POST " << m.data << "\n";
        });
    }
};

// ----------------------------
// 主函数
// ----------------------------
int main() {
    cout << "🚀 Starting Concurrent Message Server...\n";

    HttpServer server;
    server.start();

    // 模拟接收多个请求
    server.send(Message("GET", "/index.html"));
    server.send(Message("POST", "/api/login"));
    server.send(Message("GET", "/style.css"));

    // 给处理线程一点时间
    this_thread::sleep_for(chrono::milliseconds(100));

    server.stop();
    cout << "✅ Server stopped.\n";

    return 0;
}

📄 CMakeLists.txt

cmake 复制代码
cmake_minimum_required(VERSION 3.14)
project(ConcurrentMessageServer LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

find_package(Threads REQUIRED)

add_executable(server_demo src/main.cpp)
target_link_libraries(server_demo PRIVATE Threads::Threads)

# 可选:启用警告
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
    target_compile_options(server_demo PRIVATE -Wall -Wextra)
endif()

✅ 项目特点(教学导向)

特性 说明
精简 核心代码仅 ~80 行,无冗余
清晰 每个组件职责分明:register_handler, send, worker_loop
并发 使用单独工作线程异步处理消息
线程安全 mutex 保护队列,atomic 控制退出
可扩展 通过继承(如 HttpServer)轻松添加新协议
现代 C++ 使用 std::function, lambda, move, lock_guard

🔧 构建与运行

bash 复制代码
git clone <your-repo> concurrent-message-server  # 或手动创建目录
cd concurrent-message-server
mkdir build && cd build
cmake ..
make
./server_demo

输出示例

复制代码
🚀 Starting Concurrent Message Server...
[HTTP] GET /index.html
[HTTP] POST /api/login
[HTTP] GET /style.css
✅ Server stopped.

相关推荐
fanged6 分钟前
操作系统番外1(Linux的测试体系)(TODO)
linux·运维·服务器
春日见21 分钟前
E2E自驾规控30讲:导论
开发语言·驱动开发·git·matlab·计算机外设
wangchunting22 分钟前
Jvm-垃圾收集器
java·开发语言·jvm
沐知全栈开发33 分钟前
PHP Math: 精通PHP中的数学函数与应用
开发语言
吴声子夜歌1 小时前
JavaScript——call()、apply()和bind()
开发语言·前端·javascript
平凡灵感码头1 小时前
C语言 printf 数据打印格式速查表
c语言·开发语言·算法
hz_zhangrl1 小时前
CCF-GESP 等级考试 2026年3月认证C++三级真题解析
c++·算法·程序设计·gesp·gesp2026年3月·gesp c++三级
兮℡檬,2 小时前
答题卡识别判卷
开发语言·python·计算机视觉
酉鬼女又兒2 小时前
零基础快速入门前端DOM 操作核心知识与实战解析(完整汇总版)(可用于备赛蓝桥杯Web应用开发)
开发语言·前端·javascript·职场和发展·蓝桥杯·js
kyle~2 小时前
C++----函数指针与函数指针类型 返回值类型 (*类型名)(参数列表)
开发语言·c++