应用场景是 socket 通信,主线程组包,每秒定时群发多个 tcp 报文,如果发送都放在一个线程里,怕中间有 TCP 堵塞,影响其他的发送。
这个需求是不是叫发令枪?什么 wait()、notify()啥的,但每秒都要发令一次,感觉好像不太像
环境是 Linux,c++11,线程用的 std::thread
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(); }。 |
2
heyjei 2020-12-23 10:39:18 +08:00
简单的做法就是,N 个线程从异步队列里竞争取数据,谁先取到数据就由谁取发送这个 TCP 包,主线程只管往异步队列里扔 TCP 包。
如果怕进程重启,异步队列丢数据的话,可以用 redis 来做异步队列 |
3
auto8888 OP @crclz 搞定了,很帅
信号量用的 std::mutex 和 std::condition_variable ![image.png]( https://i.loli.net/2020/12/23/XHubcOW7FgtpoCV.png) |