- 论坛徽章:
- 15
|
本帖最后由 yulihua49 于 2017-08-02 11:45 编辑
- do {
- *buffer=0;
- r_len=AIO_read(fd,buffer,SDBC_BLKSZ);
- if(r_len<=0)break;
- NetHead->PROTO_NUM=0;
- NetHead->data=buffer;
- NetHead->PKG_LEN=r_len;
- NetHead->ERRNO1=0;
- if(r_len==SDBC_BLKSZ)
- NetHead->ERRNO2=PACK_CONTINUE;
- else
- NetHead->ERRNO2=0;
- li_ret=SendPack(connect,NetHead);
- if(li_ret) {
- ShowLog(1,"%s: SendPack2 ret=%d,err=%d,%s",__FUNCTION__,li_ret,
- errno,strerror(errno));
- close(fd);
- return -1;
- }
- len+=r_len;
- } while(r_len==SDBC_BLKSZ);
复制代码 这是一个M的简单例子,向客户端传送文件。
注意3、14行。AIO_read(),就是一个C层接口。用起来就如同read一样。看起来也是同步阻塞完成任务。SendPack()也是一样。
但是他们都会自动判断是否异步环境,在异步环境下,线程会yield,放弃这个任务,为其他任务服务。直到这个任务的事件出现,就会有一个线程resume,继续这个任务。
这当然是很复杂的资源控制过程,他是由专门的团队提供的,业务人员并不懂这些,也无需懂,按规定调用即可。这个程序是否看起来结构简单逻辑清晰,不像是异步操作那么复杂凌乱?还有一个好处,如果AIO_read()过于复杂不好写,可以先在内部调用read(),马上你就可以提交一个功能测试版,大大加快了工程进度。别人在进行测试时这个C团队就可以慢慢的实现AIO功能。
这就是MVC的作用。
|
|