2008年2月28日 星期四

Callback function

Callback = Call back
= Call me back when you have done the job
= 回電﹝回個電話﹞
= 做好了請叫我一下。
Call back 是英語世界的日常用語。

有一天,內地的A想請港口的B搬貨櫃,A拿起手機呼叫B:
A: 呼叫B!請把港口的貨櫃搬上輪船,搬完後請回電告訴我一共搬了幾櫃。
B: 電話幾號?
A: 0123456789。
於是B開始搬貨櫃,搬完後打了那個電話號碼,告訴A一共搬了幾櫃。

在程式裡面使用C實作這種call back機制時,A必須傳一個function pointer
給B,讓B可以使用這個function pointer來通知A。這個function pointer
內含某個function的位址,而這個function就被稱為callback function,
並不是因為這個function的長相特別,只是因為它的用途是特別設計給B來
回呼而已。

先了解function pointer的使用,就可以了解如何使用callback了。

有些人對於C語言沒給callback function一個特別的長相有點不滿意,所以
特別定製了一個modifier﹝修飾字﹞叫做CALLBACK,冠在函式名稱前面
以顯名號,就是要告訴看程式碼的人:「這是一個callback function! 這樣
講你應該就知道它是做什麼的了吧。請看看文件或找找程式碼,到底是誰會
傳這個callback function給哪些人......這可是精心設計的。機關重重,請
小心謹慎。」

會需要設計出callback機制的場合,通常比較特殊,例如 iterative processing
或非同步的程式。Tree traversal是iterative processing的一個例子,當然
也只有把tree traversal通用化才會使用到callback。非同步就例如non-blocking
socket、non-blocking I/O、或多執行緒程式了。

2008年2月2日 星期六