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

2020-12-23 10:20:57 +08:00
 auto8888

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

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

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

1809 次点击
所在节点    C++
3 条回复
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
2020-12-23 10:39:18 +08:00
简单的做法就是,N 个线程从异步队列里竞争取数据,谁先取到数据就由谁取发送这个 TCP 包,主线程只管往异步队列里扔 TCP 包。

如果怕进程重启,异步队列丢数据的话,可以用 redis 来做异步队列
auto8888
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)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/738114

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX