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

定时群发报文时,怎么做多线程比较优雅?

  •  
  •   auto8888 · 2020-12-23 10:20:57 +08:00 · 1791 次点击
    这是一个创建于 1433 天前的主题,其中的信息可能已经有所发展或是发生改变。

    应用场景是 socket 通信,主线程组包,每秒定时群发多个 tcp 报文,如果发送都放在一个线程里,怕中间有 TCP 堵塞,影响其他的发送。

    这个需求是不是叫发令枪?什么 wait()、notify()啥的,但每秒都要发令一次,感觉好像不太像

    环境是 Linux,c++11,线程用的 std::thread

    3 条回复    2020-12-23 13:12:31 +08:00
    crclz
        1
    crclz  
       2020-12-23 10:30:26 +08:00
    用信号量啊。信号量是关于生产和消费的。
    假设 N 个线程负责定时向 N 个 TCP 连接发送报文。我们称这 N 个线程为 N 个 worker 。
    你这个模型就是生产和消费“发报文指令”的。主线程生产指令,worker 消费指令。

    每一个 worker 都具有一个信号量 S,这个 S 的意义是“发报文指令”
    主线程每秒对每一个 worker 的 S 进行 down,意思是生产一个发报文指令。
    同时 worker 的代码是:while true { up(S); send(); }。
    heyjei
        2
    heyjei  
       2020-12-23 10:39:18 +08:00
    简单的做法就是,N 个线程从异步队列里竞争取数据,谁先取到数据就由谁取发送这个 TCP 包,主线程只管往异步队列里扔 TCP 包。

    如果怕进程重启,异步队列丢数据的话,可以用 redis 来做异步队列
    auto8888
        3
    auto8888  
    OP
       2020-12-23 13:12:31 +08:00
    @crclz 搞定了,很帅

    信号量用的 std::mutex 和 std::condition_variable

    ![image.png]( https://i.loli.net/2020/12/23/XHubcOW7FgtpoCV.png)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3301 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 12:25 · PVG 20:25 · LAX 04:25 · JFK 07:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.