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的结果,才会继续执行