现代 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.

相关推荐
进击的程序猿~2 分钟前
Go 内存分配与垃圾回收源码深度学习手册
开发语言·后端·golang
无锡耐特森3 分钟前
通过CAN转Profinet网关与PLC的配合引领智慧物流的未来
运维·服务器·网络
June`15 分钟前
warp shuffle指令
c++·人工智能·算法·cuda
geovindu16 分钟前
go:Bit Operation Algorithm
开发语言·后端·算法·golang·位运算法
有续技术20 分钟前
三菱 (Mitsubishi) 机床 设置查看 IP 地址
linux·服务器·网络
yagami_gagami35 分钟前
第四届黄河流域公安院校电子物证个人赛服务器取证
linux·服务器·网络·mysql·安全·docker·llama
choumin42 分钟前
C程序能调用extern “C“声明的带默认参数的C++函数吗?
c语言·c++·extern c·默认参数
邪修king1 小时前
Re:Linux系统篇(七) 开发工具篇 Chapter3:Makefile 从入门到精通 —— 依赖关系、伪目标、栈式推导与自动化构建全解
linux·运维·服务器·vim
bosins1 小时前
Ubuntu 日常最常用的文件操作场景和对应指令
linux·服务器·ubuntu
AmyLin_20011 小时前
PDF 色彩保真工程实践【3】上手实践:工程结构、依赖集成与一键构建运行
c++·visualstudio·pdf·zlib·vcpkg·libtiff·cmyk