C語言面試題分類->回調

來源:互聯網
上載者:User

標籤:個數   back   主動權   封裝   資料   AC   --   依賴   執行   

本文主要講解如果實現回調,特別是在封裝介面的時候,回調顯得特別重要,我們首先假設有兩個程式員在寫代碼,A程式員寫底層驅動介面,B程式員寫上層應用程式,然而此時底層驅動介面A有一個資料d需要傳輸給B,此時有兩種方式:
   1、A將資料d儲存好放在介面函數中,B自己想什麼時候去讀就什麼時候去讀,這就是我們經常使用的函數調用,此時主動權是B。
   2、A實現回調機制,當資料變化的時候才將通知B,你可以來讀取資料了,然後B在使用者層的回呼函數中讀取速度d,完成OK。此時主動權是A。
很明顯第一種方法太低效了,B根本就不知道什麼時候該去調用介面函數讀取資料d。而第二種方式由於B的讀取資料操作是依賴A的,只有A叫B讀資料,那麼B才能讀資料。也即是實現了中斷讀取。
那麼回調是怎麼實現的呢,其實回呼函數就是一個通過函數指標調用的函數。如果使用者層B把函數的指標(地址)作為參數傳遞給底層驅動A,當這個指標在A中被用為調用它所指向的函數時,我們就說這是回呼函數。
注意:是在A中被調用,這裡看到儘管函數是在B中,但是B卻不是自己調用這個函數,而是將這個函數的函數指標通過A的介面函數傳自A中了,由A來操控執行,這就是回調的意義所在。
下面就通過一個例子來示範
首先寫A程式員的代碼

//-----------------------底層實現A-----------------------------typedef void (*pcb)(int a); //函數指標定義,後面可以直接使用pcb,方便typedef struct parameter{    int a ;    pcb callback;}parameter; void* callback_thread(void *p1)//此處用的是一個線程{    //do something    parameter* p = (parameter*)p1 ;    while(1)    {        printf("GetCallBack print! \n");        sleep(3);//延時3秒執行callback函數        p->callback(p->a);//函數指標執行函數,這個函數來自於應用程式層B    }}//留給應用程式層B的介面函數extern SetCallBackFun(int a, pcb callback){    printf("SetCallBackFun print! \n");    parameter *p = malloc(sizeof(parameter)) ;     p->a  = 10;    p->callback = callback;    //建立線程    pthread_t thing1;    pthread_create(&thing1,NULL,callback_thread,(void *) p);    pthread_join(thing1,NULL);}

上面的代碼就是底層介面程式員A寫的全部代碼,留出介面函數SetCallBackFun即可

下面再實現應用者B的程式,B負責調用SetCallBackFun函數,以及增加一個函數,並將吃函數的函數指標通過SetCallBackFun(int a, pcb callback)的第二個參數pcb callback 傳遞下去。

//-----------------------應用者B-------------------------------void fCallBack(int a)       // 應用者增加的函數,此函數會在A中被執行{    //do something    printf("a = %d\n",a);    printf("fCallBack print! \n");}int main(void){    SetCallBackFun(4,fCallBack);    return 0;}

運行程式會看到

先會列印A程式的                 printf("GetCallBack print! \n");然後等待3秒鐘才會列印應用者B的    printf("fCallBack print! \n");

C語言面試題分類->回調

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.