同步调用,回调,异步调用

时间:2021-10-01 23:32:47

同步调用

同步调用:阻塞式调用。

举个栗子:
A B C D 四个烽火台,需要传递消息。顺序是A->B->C->D。消息需要逐个传递,因此时间主要消耗在了等待上。


回调

回调:双向调用的方式。

举个栗子:
依旧是A B C D四个烽火台,顺序依然是A B C D,假设烽火台多了一位士兵,在A接收到信息而还没有点燃烽火的时候,可以先将士兵派出,这个士兵即是“回调函数“。 此时,先执行回调函数,再执行后面的。
即:

回调: 在函数的参数列表中添加一个其他函数的指针,需要的时候直接调用这个函数即可。

typedef void (*pcb)(char *);

void getCallback(pcb callback)
{
...
}

void fCallback(char *s)
{
...
}

getCallback(fCallback); //参数传递,函数指针

调用规范:
三个: (默认为 _cdecl)

  • _cdecl
  • _stdcall
  • _pascal

不同的调用规范之间不能相互赋值,即使有相同的返回值以及参数列表。


异步调用

异步调用: 类似于消息,不过方向相反而已。当接口的服务接收到消息 或 事件发生时,去主动通知调用客户方。 (即通知调用客户方的接口)

举个栗子:
依旧是 A B C D四个烽火台,此时增加一个官员 F, F将消息分别告诉A B C D 而不必等待 A B C D各自返回。 当 A B C D各自完成的时候就会通知 F , F 收到四个完成的消息之后,就知道整个过程完成了。


写个伪代码模拟下过程:

/* 同步调用 */
auto signal = false;

while (!signal)
signal = wait(A.light());

signal = false;
while (!signal)
signal = wait(B.light());

signal = false;
while (!signal)
signal = wait(C.light());

signall = false;
while (!signal)
signal = wait(D.light());

complete!

/* 回调 */

void light_tower(A, callback){
callback(); //先执行回调
A.light();
}

void callback(){
B.light();
}

/* 异步调用 */

A.light() {
this.light();
this.while_complete(this.tell(F));
}

B.light() {
this.light();
this.while_complete(this.tell(F));
}

C.light() {
this.light();
this.while_complete(this.tell(F));
}

D.light() {
this.light();
this.while_complete(this.tell(F));
}