我一直在努力尝试在谷歌上找到我的答案,因为我不知道我想要搜索的确切术语。
如果有人要构建类似msn messenger的程序,是否可以拥有始终打开的连接而不是while(true)循环?如果是这样,有人能指出我如何实现这一目标吗?
答案 0 :(得分:4)
使用boost::asio
库进行套接字处理,我认为可以在接收数据时定义回调。
答案 1 :(得分:3)
您要查找的唯一一个神奇词是异步I / O 。这可以通过使用异步API(诸如ReadThis()之类的函数立即返回并在成功/失败时发出信号(例如但不限于boost :: asio)或通过将阻塞调用推迟到不同线程来实现。选择任何一种方法都需要仔细权衡底层实施和操作规模。
答案 2 :(得分:1)
您想使用ACE。它有一个Reactor模式,可以在数据可用时通知您。
答案 3 :(得分:1)
你可以:
while(1) {
sleep(100); // 100 ms
// check if there is a message
// process message
//...
}
这没关系,但是在运行10000个线程的服务器上存在开销,因为线程从睡眠状态退出并检查消息,从而导致上下文切换。相反,操作系统在Linux上提供select
和epoll
等功能,允许线程在事件上等待。
while(1) {
// wait for message
// process message
//...
}
使用wait,除非收到消息,否则线程不会被“唤醒”。
答案 4 :(得分:0)
你只能隐藏某个库中隐藏的while循环(或某种循环),或者在事件回调中重新开始等待下一个IO,但你无法完全避免它。
答案 5 :(得分:0)
这是一个很好的问题。就像nj所说,你想使用异步I / O.太多的程序使用轮询策略。在系统上运行1000个线程并不罕见。如果所有这些都是轮询,那么你的系统会很慢。尽可能使用异步I / O.
答案 6 :(得分:0)
udp协议通信怎么样?你不必在每个客户的循环中等待 只需在指定端口上打开一个连接并调用receive方法