建立執行緒:CreateThread與pthread_create引數比較
建立執行緒
在 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);
注意:在 Windows 中,受可用虛擬記憶體的限制,一個程序可以建立的執行緒數目是有限的。預設情況下,每個執行緒有一兆棧空間。因此,您最多可以建立 2,028 個執行緒。如果您減小預設棧大小,那麼可以建立更多執行緒。在 Linux 中,使用 ULIMIT -a(limits for all users)可以獲得每個使用者可以建立的執行緒的最大數目,可以使用 ULIMIT -u 來修改它,不過只有在登入時才可以這樣做。 /usr/Include/limit.h 和 ulimit.h 下的標頭檔案定義了這些內容。您可以修改它們並重新編譯核心,以使其永久生效。對於 POSIX 執行緒限制而言,local_lim.h 中定義的 THREAD_THREADS_MAX 巨集定義了數目的上限。
指定執行緒函式
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