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

来源:互联网 发布:cpu硅脂品牌 知乎 编辑:程序博客网 时间:2024/05/16 05:29

同步调用

同步调用:阻塞式调用。

举个栗子:
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));}
0 0
原创粉丝点击