OCI編程高級篇(二十一) OCI的線程支持和函數原型
訪問www.tomcoding.com網站,學習Oracle內部數據結構,詳細文檔說明,下載Oracle的exp/imp,DUL,logminer,ASM工具的源代碼,學習高技術含量的內容。
OCI提供了一個統一的線程調用接口,使OCI程序能夠進行線程編程,不過這個接口也是有限制的,如果OCI程序運行的操作系統不支持多線程,調用接口就會出錯。
要想使用OCI的多線程接口,也是有調用順序的,OCI的文檔只提供了一堆函數,并沒有給出函數調用的步驟,在這里我們看一下具體的操作。主調用線程的步驟。
1. 創建一個OCI環境句柄,必須使用OCI_THREADED模式,否則會出現信號11引起的段錯誤。
2. 線程包在進程級別的初始化操作,調用OCIThreadProcessInit()函數。
3. 初始化線程包的上下文信息,調用OCIThreadInit()函數。
4. 為每個要創建的線程初始化線程ID,調用OCIThreadIdInit()函數。
5. 為每個要創建的線程初始化線程句柄,調用OCIThreadHndInit()函數。
6. 創建每一個線程,調用OCIThreadCreate()函數。
7. 子線程分別開始執行,主線程調用OCIThreadJoin()函數,等待每個子線程結束。
8. 主線程關閉每個子線程句柄,調用OCIThreadClose()函數。
9. 主線程銷毀每個子線程的ID和句柄,調用OCIThreadIdDestroy()和OCIThreadHndDestroy()函數。
10. 主線程結束線程包上下文,調用OCIThreadTerm()函數。
先來看看各個函數的原型和參數。
初始化線程包函數OCIThreadProcessInit(),原型和參數如下。
void OCIThreadProcessInit ( );
這個函數比較簡潔,沒有參數,也沒有返回值。
初始化線程包的上下文函數OCIThreadInit(),原型和參數如下。
sword OCIThreadInit ( void *hndl, OCIError *err );
hndl是一個輸入/輸出參數,OCI的環境句柄。
err是一個輸入/輸出參數,錯誤句柄,返回錯誤碼和錯誤信息文本。
初始化線程ID函數OCIThreadIdInit(),原型和參數如下。
sword OCIThreadIdInit ( void *hndl,
OCIError *err,
OCIThreadId **tid );
hndl是一個輸入/輸出參數,OCI的環境句柄。
err是一個輸入/輸出參數,錯誤句柄,返回錯誤碼和錯誤信息文本。
tid是一個輸出參數,是一個指針的指針,指向要初始化的線程ID。
初始化線程句柄函數OCIThreadHndInit(),原型和參數如下。
sword OCIThreadHndInit ( void *hndl,
OCIError *err,
OCIThreadHandle **thnd );
hndl是一個輸入/輸出參數,OCI的環境句柄。
err是一個輸入/輸出參數,錯誤句柄,返回錯誤碼和錯誤信息文本。
thnd是一個輸出參數,是一個指針的指針,指向要初始化的線程句柄。
創建線程函數OCIThreadCreate(),原型和參數如下。
sword OCIThreadCreate ( void *hndl,
OCIError *err,
void (*start) (void *),
void *arg,
OCIThreadId *tid,
OCIThreadHandle *tHnd );
hndl是一個輸入/輸出參數,OCI的環境句柄。
err是一個輸入/輸出參數,錯誤句柄,返回錯誤碼和錯誤信息文本。
start是一個輸入參數,線程函數指針,新線程的入口函數。
arg是一個輸入參數,傳遞給線程函數的參數。
tid是一個輸入/輸出參數,返回線程的ID。
tHnd是一個輸入/輸出參數,返回線程的句柄。
線程加入函數OCIThreadJoin(),原型和參數如下。
sword OCIThreadJoin ( void *hndl,
OCIError *err,
OCIThreadHandle *tHnd );
hndl是一個輸入/輸出參數,OCI的環境句柄。
err是一個輸入/輸出參數,錯誤句柄,返回錯誤碼和錯誤信息文本。
tHnd是一個輸入參數,要加入的線程的句柄。
這個函數不太好理解,其實說白了,就是程序執行到這個函數時,加入tHnd線程的代碼,要等到線程代碼執行完了,才能執行函數后面的程序代碼,好比是把線程代碼放到了這個函數之前先執行。
關閉線程句柄函數OCIThreadClose(),原型和參數如下。
sword OCIThreadClose ( void *hndl,
OCIError *err,
OCIThreadHandle *tHnd );
hndl是一個輸入/輸出參數,OCI的環境句柄。
err是一個輸入/輸出參數,錯誤句柄,返回錯誤碼和錯誤信息文本。
tHnd是一個輸入參數,要關閉的線程的句柄。
這個函數與OCIThreadHndInit()函數是相對的,關閉初始化并且創建后返回的線程句柄。
銷毀線程ID函數OCIThreadIdDestroy(),原型和參數如下。
sword OCIThreadIdDestroy (void *hndl,
OCIError *err,
OCIThreadId **tid );
hndl是一個輸入/輸出參數,OCI的環境句柄。
err是一個輸入/輸出參數,錯誤句柄,返回錯誤碼和錯誤信息文本。
tid是一個輸入/輸出參數,指向被銷毀的線程ID。
銷毀線程句柄函數OCIThreadHndDestroy(),原型和參數如下。
sword OCIThreadHndDestroy ( void *hndl,
OCIError *err,
OCIThreadHandle **thnd );
hndl是一個輸入/輸出參數,OCI的環境句柄。
err是一個輸入/輸出參數,錯誤句柄,返回錯誤碼和錯誤信息文本。
thnd是一個輸入/輸出參數,指向被銷毀的線程句柄。
結束線程包上下文函數OCIThreadTerm(),原型和參數如下。
sword OCIThreadTerm ( void *hndl, OCIError *err );
hndl是一個輸入/輸出參數,OCI的環境句柄。
err是一個輸入/輸出參數,錯誤句柄,返回錯誤碼和錯誤信息文本。
這個函數與OCIThreadInit()相對應,每調用一次初始化,都要相應的結束一次。
下一節我們寫一個代碼實例演示一下線程函數的使用過程。

浙公網安備 33010602011771號