CreateThread與pthread_create引數比較
阿新 • • 發佈:2019-02-17
建立執行緒
在 Windows 中,您可以使用 CreateThread() 來建立執行緒,建立的執行緒在呼叫程序的虛擬地址空間中執行。HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
SIZE_T dwStackSize, // initial stack size
LPTHREAD_START_ROUTINE lpStartAddress, // thread function
LPVOID lpParameter, // thread argument
DWORD dwCreationFlags, // creation option
LPDWORD lpThreadId // thread identifier
);
lpThreadAttributes 是指向執行緒屬性的指標,決定了執行緒控制代碼是否能由子程序繼承。
Linux 使用 pthread 庫呼叫 pthread_create() 來派生執行緒:
int pthread_create (
pthread_t *thread_id,
pthread_attr_t *threadAttr,
void * (*start_address)(void *),
void * arg);
注意:
指定執行緒函式
CreateThread() 中的 lpStartAddress 引數是剛建立的執行緒要執行的函式的地址。 pthread_create() 庫呼叫的 start_address 引數是剛建立的執行緒要執行的函式的地址。
傳遞給執行緒函式的引數
在 Windows 中,系統呼叫 CreateThread() 的引數 lpParameter 指定了要傳遞給剛建立的執行緒的引數。它指明瞭將要傳遞給新執行緒的資料條目的地址。在 Linux 中,庫呼叫 pthread_create() 的引數 arg 指定了將要傳遞給新執行緒的引數。
設定棧大小
在 Windows 中,CreateThread() 的引數 dwStackSize 是將要分配給新執行緒的以位元組為單位的棧大小。棧大小應該是 4 KB 的非零整數倍,最小為 8 KB。在 Linux 中,棧大小線上程屬性物件中設定;也就是說,將型別為 pthread_attr_t 的引數 threadAttr 傳遞給庫呼叫 pthread_create()。在設定任何屬性之前,需要通過呼叫 pthread_attr_init() 來初始化這個物件。使用呼叫 pthread_attr_destroy() 來銷燬屬性物件:
int pthread_attr_init(pthread_attr_t *threadAttr);
int pthread_attr_destroy(pthread_attr_t *threadAttr);
注意,所有 pthread_attr_setxxxx 呼叫都有與 pthread_xxxx 呼叫(如果有)類似的功能,只是您只能在執行緒建立之前使用 pthread_attr_xxxx,來更新將要作為引數傳遞給 pthread_create 的屬性物件。同時,您在建立執行緒之後的任意時候都可以使用 pthread_xxxx。
使用呼叫 pthread_attr_setstacksize() 來設定棧大小: int pthread_attr_setstacksize(pthread_attr_t *threadAttr, int stack_size);。
退出執行緒
在 Windows 中,系統呼叫 ExitThread() 會終止執行緒。 dwExitCode 是執行緒的返回值,另一個執行緒通過呼叫 GetExitCodeThread() 就可以得到它。 VOID ExitThread(
DWORD dwExitCode // exit code for this thread
);
Linux 中與此相對應的是庫呼叫 pthread_exit()。 retval 是執行緒的返回值,可以在另一個執行緒中通過呼叫 pthread_join() 來獲得它: int pthread_exit(void* retval);。