同步调用
同步调用:阻塞式调用。
举个栗子:
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));
}