选择套接字编程

时间:2012-09-06 09:13:42

标签: c sockets client-server

使用select()函数有用吗?

从我的(小)经验来看,我倾向于相信线程就足够了。

所以我想知道,select()只是一个不熟悉线程的人的教学工具吗?

2 个答案:

答案 0 :(得分:2)

考虑以下示例。您有一个中等忙碌的Web服务器,其中包含100K连接。您没有使用select或类似的任何内容,因此每个连接都有一个线程,这意味着100K线程很快就会出现问题。

即使你调整你的系统直到它允许这样的怪物,大多数线程只会在套接字上等待。如果有一种机制在套接字变得有趣时通知你,那会不会更好?

换句话说,线程和select类似的机制是互补的。您无法使用threads替换简单的select:监视文件描述符。

答案 1 :(得分:1)

单线程轮询最简单易用,实现和(最重要的)理解。并发编程为您的项目增加了巨大的智力成本:同步数据非常棘手且容易出错,锁定为错误带来了许多机会,无锁数据结构导致性能下降,并且程序流程难以在心理上可视化(或“序列化”)也许)。

相比之下,单线程轮询(可能使用epoll / kqueue而不是select)会给您带来非常好的表现(当然取决于您在做什么对数据的反应)同时保持直截了当。

特别是在Linux中,你可以将timerfds,eventfds,signalfds和inotify-fds以及嵌套的epoll-fds全部放在你的投票集中,为你提供一种非常统一的方式来处理各种各样的“异步“事件。如果你最终需要更多的性能,你可以通过同时运行多个轮询器来实现单点并行,并且大部分数据同步都是由内核完成的 ,它承诺只有一个线程接收到在准备就绪时进行成功的民意调查。