V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ccagml
V2EX  ›  编程

大佬们,都来帮我分析分析这个程序设计

  •  
  •   ccagml · 2023-01-13 09:40:55 +08:00 · 1252 次点击
    这是一个创建于 714 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前因

    • 小弟正在用 c++ 和 Boost.Asio 闭门造车写一个玩具

    玩具的主要结构

    1. 主函数 main 中有个循环,不断从 队列 msg_queue 中取出数据处理.
    2. msg_queue 的数据来源有:
      • 2.1 控制台输入
        • 2.1.1 创建 一个线程 的线程池 boost::asio::thread_pool _console_thread(1)
        • 2.1.2 通过 boost::asio::post 让 匿名函数 f 在 _console_thread 中工作
        • 2.1.3 匿名函数 f 是 死循环 从 std::cin 读取输入, 放入 msg_queue
      • 2.2 数据库执行结果
        • 2.2.1 使用 mysqlcapi (libmysqlclient.so)
        • 2.2.2 创建 一个线程 的线程池 boost::asio::thread_pool _db_thread(10)
        • 2.2.3 不断从 db_queue 取出 需要执行的内容
          • db_queue 的数据来源是 1.的处理结果
        • 2.2.4 将执行结果放入 msg_queue
      • 2.3 网络通信
        • 2.3.1 创建 一个线程 的线程池 boost::asio::thread_pool _io_worker_thread(1)
        • 2.3.2 通过 boost::asio::post 让 _io_worker_thread 执行 boost::asio::io_context 的 run()
        • 2.3.3 通过 async_read_some 从 socket 读取数据, 如果完整了就放入 msg_queue
        • 2.3.4 每个 socket 上 有一个待发送的队列 wait_queue, 用 boost::asio::async_write 将 wait_queue 按顺序发出去
          • wait_queue 的数据来源是 1.的处理结果

    想要请教的问题

    1. 目前这样的结构设计会有什么问题吗? 有什么不足之处?
    2. 在 2.3.2 中 只用 一个线程 执行 io_context.run(), 是不是表示 所有 socket 的 读写 都共用这个线程在处理?处理能力会不足吗?
    ccagml
        1
    ccagml  
    OP
       2023-01-13 18:07:46 +08:00 via Android
    🌝大佬们!什么情况?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5802 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 06:23 · PVG 14:23 · LAX 22:23 · JFK 01:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.