Common Lisp 的標準沒有對多線程的描述,所以各類 CL 實現都給出了本身的多線程功能函數,具體細節有所不一樣,這裏大體講解一下 Clozure CL 的多線程函數的簡單用法(參照 CCL 的描述文檔中多線程部分 第7章 Programming with threads)。 我在閱讀CCL文檔時被搞暈了,發現找不到線程對象做爲參數的正確寫法,後來通過 cn-lisp 的朋友指點,才發現不存在所謂的正確寫法,只能把線程對象綁定到全局變量上使用,估計有人在學習 CCL 的多線程時會遇到相似的問題,因此這裏把個人一點學習體會記錄下來,但願能對其餘初學者有所助益,幫助其餘人少走些彎路。多線程
【全局變量】當前線程:*current-process*函數
在 ccl 中執行以下:學習
Welcome to Clozure Common Lisp Version 1.8-store-r15418 (DarwinX8664)! ? ? *current-process* #<COCOA-LISTENER-PROCESS Listener(15) [Active] #x30200108839D> ?
其中 #< . . . > 是線程對象的表示方式,第一列表示線程類型,第二列表示線程名稱,小括號裏面的數字表示線程序列號,方括號裏的內容表示線程的狀態,最後以 #x 打頭的一串數字表示這個線程對象在內存中的地址。線程
【全局變量】每秒時間片 *TICKS-PER-SECOND*code
顧名思義,就是把1秒鐘的 CPU 資源平分爲 100 份,每一份是一個時間片,時間片是一種系統資源,由 OS 統一調度對象
? *TICKS-PER-SECOND* 100 ?
【toplevel 命令】顯示當前線程: :proc內存
? :proc 15 : -> Listener [Active] 13 : sleeper [Reset] 10 : sleeper [semaphore wait] (Suspended) 7 : sleeper [semaphore wait] 5 : housekeeping [Sleep] 0 : Initial [Reset] ?
【toplevel 命令】yield 指定線程資源
該命令能夠用線程序列號或者線程名稱字符串做爲標識線程對象的參數。文檔
使用線程序列號做爲 process 參數字符串
? (:y 13)
以下是使用線程名稱字符串做爲 process 參數
? (:y "sleeper)
【函數】 顯示所有 Lisp 線程:all-processes
? (all-processes) (#<COCOA-LISTENER-PROCESS Listener(15) [Active] #x3020010F589D> #<PROCESS sleeper(13) [semaphore wait] #x3020010572ED> #<PROCESS sleeper(10) [semaphore wait] #x30200102EDED> #<PROCESS sleeper(7) [semaphore wait] #x302000E07A9D> #<PROCESS housekeeping(5) [Sleep] #x302000DF69FD> #<APPKIT-PROCESS Initial(0) [Reset] #x3020000C0B5D>) ?
####【注意】: CCL提供的線程函數對線程對象的引用方式比較麻煩,沒法直接經過線程序列號或線程名稱字符串來引用,只能經過把由線程相關函數返回的線程對象綁定到全局變量上的辦法來引用。
實例以下:
把當前線程綁定到全局變量 *p* 上,以下 (defparameter *p* *current-process*):
? *current-process* #<COCOA-LISTENER-PROCESS Listener(15) [Active] #x30200108839D> ? (defparameter *p* *current-process*) *P* ? *p* #<COCOA-LISTENER-PROCESS Listener(15) [Active] #x30200108839D> ?
從線程列表中綁定一個線程對象到全局變量 *select-process* 上,例子中使用第3個
? (all-processes) (#<COCOA-LISTENER-PROCESS Listener(15) [Active] #x3020010F589D> #<PROCESS sleeper(13) [semaphore wait] #x3020010572ED> #<PROCESS sleeper(10) [semaphore wait] #x30200102EDED> #<PROCESS sleeper(7) [semaphore wait] #x302000E07A9D> #<PROCESS housekeeping(5) [Sleep] #x302000DF69FD> #<APPKIT-PROCESS Initial(0) [Reset] #x3020000C0B5D>) ? (defparameter *select-process* (third (all-processes))) *SELECT-PROCESS* ? *select-process* #<PROCESS sleeper(10) [semaphore wait] #x30200102EDED> ?
【函數】查看線程狀態:process-whostate
? (process-whostate *select-process*) "semaphore wait" ?
其他的線程函數均可以經過查詢手冊獲得詳細解釋,就很少說了。
(說明:上述實例都在 Clozure CL 環境中執行經過;在 Emacs 環境中函數和全局變量能夠執行,可是 Toplevel 命令沒法執行)