【发布时间】:2012-11-05 09:34:43
【问题描述】:
我正在为网络产品开发一个后端,它服务于十几个客户 (N = 10-100)。每个连接需要 2 个周期性任务,即心跳和通过 SSH 下载遥测数据,每个任务都在 HHz。还有来自前端的不同类型的额外事件。根据每个任务的性质,在每个连接的套接字上的select 调用中都有一个固定的等待部分,这允许操作系统在等待响应时经常在线程之间切换以服务其他客户端。
在我的初始实现中,我为每个连接创建 3 个线程(心跳、遥测、额外),每个线程等待一个条件变量,每当工作队列中有事情要做时,就会戳这个条件变量。工作队列使用计时器和来自前端的命令填充上述周期性事件。
我有几个问题。
将工作线程池方法切换到英特尔 TBB 任务是否是个好主意?如果是这样,我需要将
tbb::task_scheduler_init初始化为哪个线程值?在当前有 300 个线程在条件变量上等待的方法中,即每秒
signaledN * H * 3次,它很可能成为可伸缩性的瓶颈(尤其是在调用 @987654327 的一侧@)。有没有更好的方法让每个任务只唤醒一个工作人员?如何在 TBB 中实现工作线程的唤醒?
感谢您的建议!
【问题讨论】:
-
您的意思是 N=10000 吗? 'select' 函数不能选择超过 FD_SETSIZE 的连接,FD_SETSIZE 通常是 1024
-
3 个线程/连接?恐怕创建 3 万个线程有点疯狂
-
我的意思是 10 到 100。select 调用在 libssh2 管道中,它只负责一个套接字。
-
哦哦,我以为你想要一万个连接
标签: c++ multithreading network-programming tbb lock-free