C++之阻塞和非阻塞区别
阻塞就是干不完不准回来,
非阻塞就是你先干,我现看看有其他事没有,完了告诉我一声
我们拿最常用的send和recv两个函数来说吧...
比如你调用send函数发送一定的Byte,在系统内部send做的工作其实只是把数据传输(Copy)到TCP/IP协议栈的输出缓冲区,它执行成功并不代表数据已经成功的发送出去了,如果TCP/IP协议栈没有足够的可用缓冲区来保存你Copy过来的数据的话...这时候就体现出阻塞和非阻塞的不同之处了:对于阻塞模式的socket send函数将不返回直到系统缓冲区有足够的空间把你要发送的数据Copy过去以后才返回,而对于非阻塞的socket来说send会立即返回WSAEWOULDDBLOCK告诉调用者说:"发送操作被阻塞了!!!你想办法处理吧..."
对于recv函数,同样道理,该函数的内部工作机制其实是在等待TCP/IP协议栈的接收缓冲区通知它说:嗨,你的数据来了.对于阻塞模式的socket来说如果TCP/IP协议栈的接收缓冲区没有通知一个结果给它它就一直不返回:耗费着系统资源....对于非阻塞模式的socket该函数会马上返回,然后告诉你:WSAEWOULDDBLOCK---"现在没有数据,回头在来看看"
扩展:
异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。以 CAsycSocket类为例(注意,CSocket从CAsyncSocket派生,但是起功能已经由异步转化为同步),当一个客户端通过调用 Connect函数发出一个连接请求后,调用者线程立刻可以向下运行。当连接真正建立起来以后,socket底 层会发送一个消息通知该对象。这里提到执行部件和调用者通过三种途径返回结果:状态、通知和回调。可以使用哪一种依赖于执行部件的实现,除非执行部件提供 多种选择,否则不受调用者控制。如果执行部件用状态来通知,那么调用者就需要每隔一定时间检查一次,效率就很低(有些初学多线程编程的人,总喜欢用一个循 环去检查某个变量的值,这其实是一种很严重的错误)。如果是使用通知的方式,效率则很高,因为执行部件几乎不需要做额外的操作。至于回调函数,其实和通知 没太多区别。
C++之阻塞和非阻塞区别相关推荐
- 同步与异步,阻塞与非阻塞的区别
1.概念剖析 相信很多从事linux后台开发工作的都接触过同步&异步.阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞.异步就是非阻塞,下面我们先剖析下这几个概念分 ...
- 阻塞、非阻塞与同步、异步的区别
一.同步和异步 二者关注的是消息通信机制 . 所谓同步,就是在发出一个"调用"时,在没有得到结果之前,该*调用*就不返回,但是一旦调用返回,就得到返回值了. 异步则是相反,&quo ...
- 32 | 答疑(四):阻塞、非阻塞 I/O 与同步、异步 I/O 的区别和联系
问题 1:阻塞.非阻塞 I/O 与同步.异步 I/O 的区别和联系 在文件系统的工作原理篇中,介绍了阻塞.非阻塞 I/O 以及同步.异步 I/O 的含义,这里我们再简单回顾一下. 首先我们来看阻塞和非 ...
- socket阻塞和非阻塞的区别
socket阻塞和非阻塞的区别 简单点说: 阻塞就是干不完不准回来, 非组赛就是你先干,我现看看有其他事没有,完了告诉我一声 我们拿最常用的send和recv两个函数来说吧... 比如你调用se ...
- linux下recv 、send阻塞、非阻塞区别和用法
非阻塞IO 和阻塞IO: 在网络编程中对于一个网络句柄会遇到阻塞IO 和非阻塞IO 的概念, 这里对于这两种socket 先做一下说明: 基本概念: 阻塞IO:: socket 的阻塞模 ...
- IO中同步、异步与阻塞、非阻塞的区别
一.同步与异步 同步/异步, 它们是消息的通知机制 1. 概念解释 A. 同步 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回. 按照这个定义,其实绝大多数函数都是同步调用(例 ...
- 写的非常不错的一篇阻塞与非阻塞、同步与异步套接字之间的区别
当你发现自己最受欢迎的一篇blog其实大错特错时,这绝对不是一件让人愉悦的事. < IO - 同步,异步,阻塞,非阻塞 >是我在开始学习epoll和libevent的时候写的,主要的思路来 ...
- 网络编程 read 阻塞和非阻塞下的区别
1,read 原型,参数以及返回值. #include <uinstd.h>ssize_t read(int fd, void *buf, size_t nbytes); -----rea ...
- java 阻塞与非阻塞_简述JAVA同步、异步、阻塞和非阻塞之间的区别
同步和异步,阻塞和非阻塞是大家经常会听到的概念,但是它们是从不同维度来描述一件事情,常常很容易混为一谈. 1. 同步和异步 同步和异步描述的是消息通信的机制. 同步 当一个request发送出去以后, ...
最新文章
- “AI明星”第四范式C轮融资超10亿元,估值约12亿美元
- 白话——胡说图像分类器
- centos7安装Oracle12(完整版)
- 手把手教你用CAB发布OCX的简单办法
- RTL行为级仿真、综合后门级功能仿真和时序仿真
- python算法与程序设计基础(第二版)第八章实训答案_Python算法与程序设计基础(第2版)...
- Shell 变量及函数讲解 [2]
- oracle差异收集明细,Oracle收集表的数据与统计信息差异
- 《计算机应用基础实训教程》,《计算机应用基础实训教程》修改稿(文).doc
- 下一版本的Android OS ——Jelly Bean
- 《视觉SLAM十四讲——从理论到实践》学习笔记
- 什么是Windows内核编程
- 为CentOS7/RHEL7安装EPEL 仓库(repo)
- HashMap简单小结
- 应用统计学学什么科目_统计学考研初试都要考哪些科目?
- CAXA实体设计 2020相对其他3D软件的优势有哪些?
- 快速实现win11恢复win10系统 分享无损恢复win10系统
- 手机linux发短信的命令,用AT指令操作短信猫发短信
- 没有银弹-软件工程中的根本和次要问题
- 塔塔露也能学会的算法(2) | 我有背包你有手么
热门文章
- 持续完善合作生态 GBase数据库3月适配认证19款产品
- fmdb和mysql的区别_fmdb数据库
- oracle计算年龄
- python编写一个程序、输入一个数判断其是偶数还是奇数,Python - 练习 判断输入是奇数,偶数,小数,还是字符...
- 如何用python爬新闻_干货:如何利用 Python 爬虫实现群发新闻早报?(详细)
- linux 挂载 lvm磁盘
- 《锋利的jQuery》笔记 第1章 认识jQuery
- babelrc 和 babel.config.js区别
- Audio系列之静音控制
- 动态添加Combo1.AddItem项目