IO模型

1.同步和异步

同步和异步指的是两个函数之间的关系

同步:A调用B,A必须得到B返回的结果才能干其它事。

异步:A调用B,同时提供给B一个函数,即回调函数,此时A没有得到任何结果继续执行,B在执行完成后,调用A提供的函数告知A。

定义:和同步相对,发出异步调用后,调用者在没有得到结果之前,就可以继续执行后续操作。调用完成后,一般通过状态、通知和回调来通知调用者。对于异步调用,调用的返回并不受调用者控制。

以回调函数为例,A调用B让他读取文件,同时提供给B一个函数,告诉B操作执行完成后,调用这个函数

同步异步的区别:请求发出后,是否要等待结果才能继续执行

2.阻塞和非阻塞

阻塞和非阻塞指的是一个函数自身的状态

阻塞:A调用B,B需要一会才能返回结果,A决定得到B返回的结果再干其它事。这是阻塞

非阻塞:A调用B,B开始执行并返回,但是没有返回结果,A继续做其他事,过一会再来取B的结果。这是非阻塞

个人觉得同步异步,阻塞非阻塞并不是组合使用的关系,因为它们描述的不是一个对象。不要混用,或者使用时说清楚,谁跟谁同/异步,谁阻塞/非阻塞

比如网络中的读取数据

bool getReply = false;
string msg;
a.litenAndAccept(b);
while(!getReply)
{
  if(a.recv(b, NonBlock) > 0)
  {
    msg = b.reply();
    getReply = true;
    continue;
  }
  sleep(1)
}

这里,a尝试读取b的缓冲区,使用NonBlock,如果没有数据,就立刻返回,所有a是非阻塞的,但是a和b之间的关系还是同步,因为a一直要等到b的结果,才会继续执行

posted @ 2023-08-01 17:54  INnoVation-V2  阅读(19)  评论(0)    收藏  举报