有没有办法在没有while循环的情况下在计算机之间传递数据? C ++

时间:2011-07-30 16:44:08

标签: c++ boost streaming live-streaming

我一直在努力尝试在谷歌上找到我的答案,因为我不知道我想要搜索的确切术语。

如果有人要构建类似msn messenger的程序,是否可以拥有始终打开的连接而不是while(true)循环?如果是这样,有人能指出我如何实现这一目标吗?

7 个答案:

答案 0 :(得分:4)

使用boost::asio库进行套接字处理,我认为可以在接收数据时定义回调。

答案 1 :(得分:3)

您要查找的唯一一个神奇词是异步I / O 。这可以通过使用异步API(诸如ReadThis()之类的函数立即返回并在成功/失败时发出信号(例如但不限于boost :: asio)或通过将阻塞调用推迟到不同线程来实现。选择任何一种方法都需要仔细权衡底层实施和操作规模。

答案 2 :(得分:1)

您想使用ACE。它有一个Reactor模式,可以在数据可用时通知您。

Reactor Pattern

答案 3 :(得分:1)

你可以:

 while(1) {
    sleep(100); // 100 ms
    // check if there is a message
    // process message
    //...
 }

这没关系,但是在运行10000个线程的服务器上存在开销,因为线程从睡眠状态退出并检查消息,从而导致上下文切换。相反,操作系统在Linux上提供selectepoll等功能,允许线程在事件上等待。

 while(1) {
    // wait for message
    // process message
    //...
 }

使用wait,除非收到消息,否则线程不会被“唤醒”。

答案 4 :(得分:0)

你只能隐藏某个库中隐藏的while循环(或某种循环),或者在事件回调中重新开始等待下一个IO,但你无法完全避免它。

答案 5 :(得分:0)

这是一个很好的问题。就像nj所说,你想使用异步I / O.太多的程序使用轮询策略。在系统上运行1000个线程并不罕见。如果所有这些都是轮询,那么你的系统会很慢。尽可能使用异步I / O.

答案 6 :(得分:0)

udp协议通信怎么样?你不必在每个客户的循环中等待  只需在指定端口上打开一个连接并调用receive方法