【问题标题】:Is there a way to communicate data between computers without while loops? C++有没有办法在没有while循环的情况下在计算机之间进行数据通信? C++
【发布时间】:2011-07-30 16:44:07
【问题描述】:

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

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

【问题讨论】:

  • 你可以睡几毫秒,等你回来看看有没有反应。
  • 查找事件和回调。
  • 你可以使用 for 循环。
  • 我认为您正在寻找的概念是反应式编程。我不熟悉它的任何 C++ 实现,但希望能有所帮助。
  • 某处至少会有一个大循环。没有循环,事情只能发生一次。

标签: c++ boost streaming live-streaming


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您想使用ACE。它有一个反应器模式,当数据可用时会通知你。

      Reactor Pattern

      【讨论】:

        【解决方案4】:

        你可以:

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

        这没问题,但是运行 10000 个线程的服务器会产生开销,因为线程会从睡眠中退出并检查消息,从而导致上下文切换。相反,操作系统在 Linux 上提供了类似selectepoll 的函数,它们允许线程等待事件。

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 您能解释一下“在事件回调中重新开始等待下一个 IO”是什么意思吗?
          • 任何 IO 阻塞,直到某些数据可用,然后在回调中处理数据,一旦回调完成阻塞继续,回调本身可能会启动或者它可能处于某种类型的循环中。不过,非阻塞 IO 稍有不同。
          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            udp 协议通信呢?您不必等待每个客户的 while 循环 只需在指定端口上打开一个连接并调用接收方法

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-06-14
              • 2013-09-03
              相关资源
              最近更新 更多