有没有一种方法可以在没有while循环的情况下在计算机之间传输数据?c++
Is there a way to communicate data between computers without while loops? C++
我一直在努力尝试在谷歌上找到我的答案,因为我不知道我要搜索的确切术语。
如果有人要构建一个类似msn的程序,是否有可能始终打开连接而没有while(true)循环?如果是这样,有人能告诉我如何实现这个目标吗?
使用boost::asio
库进行套接字处理,我认为可以在数据接收时定义回调
你要找的一个神奇的词是异步I/O。这可以通过使用异步api(如ReadThis()这样的函数,在成功/失败时立即返回并发出信号——类似但不受boost::asio的限制)或通过延迟对不同线程的阻塞调用来实现。选择任何一种方法都需要仔细权衡底层实现和操作规模。
您需要使用ACE。它有一个Reactor模式,可以在数据可用时通知您。
反应器模式你可以:
while(1) {
sleep(100); // 100 ms
// check if there is a message
// process message
//...
}
这是可以的,但是在运行上万个线程的服务器上有一个开销,因为线程从睡眠中出来检查消息,导致上下文切换。相反,操作系统提供了像Linux上的select
和epoll
这样的函数,它们允许线程等待事件。
while(1) {
// wait for message
// process message
//...
}
使用wait,线程不会被"唤醒",除非收到消息。
你只能隐藏你的while循环(或某种循环)隐藏在某个库的某个地方,或者在事件回调中重新启动等待下一个IO,但你不能完全避免它。
这个问题问得好。正如nj所说,您希望使用异步I/O。太多的程序使用轮询策略。在一个系统上运行1000个线程并不罕见。如果它们都轮询,系统就会变慢。
udp协议通信怎么样?你不必为每个客户端等待while循环只需在指定端口上打开一个连接并调用接收方法
相关文章:
- 在没有太多条件句的情况下,我如何避免被零除
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 在未初始化映射的情况下,将值插入到映射的映射中
- 是默认情况下分配给char数组常量的值
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 如何在不产生任何垃圾的情况下获得C中的像素
- 在已经使用Git的情况下减少编译时间
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 如何在没有信号的情况下从C++执行QML插槽
- 如何在不知道向量大小的情况下输入向量内部的向量?
- 为什么在某些情况下不写入此文件?
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 在没有Xcode的情况下在Mac捆绑包中嵌入框架
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 在 c++ 中连接字符串和整数,以便在 C++ 11 不支持计算机的情况下读取多个文件
- 如何在不影响原始内容的情况下审查计算机屏幕上的内容
- 为什么在OpenCV如此完备的情况下,Matlab在计算机视觉社区如此受欢迎?< / h1 >
- 有没有一种方法可以在没有while循环的情况下在计算机之间传输数据?c++
- 是否在未经用户许可的情况下将数据发送到特定计算机?C++