執行緒

執行緒（thread）在計算機科學中，是將程序劃分為兩個或多個執行緒（例項）或子程序，由單處理器（單執行緒）或多處理器（多執行緒）或多核處理系統併發執行。

狀態

執行緒有四種基本狀態，分別為：

產生（spawn）
阻塞（block）
非阻塞（unblock）
結束（finish）

執行緒包含要素

執行緒核心物件 (thread kernel object)
執行緒環境塊 (thread environment block, TEB)
使用者模式棧 (user-mode stack)（unblock）
核心模式棧 (kernal-mode stack)(thread environment block, TEB)
DLL 執行緒連線 (attach) 和執行緒分離 (detach) 通知 (kernal-mode stack)

不同平臺的執行緒

3.1 UNIX International 執行緒

3.1.1 UNIX International 執行緒簡介

作業系統使用的執行緒叫做 UNIX International 執行緒，支援核心執行緒、輕權程序和使用者執行緒。一個程序可有大量使用者執行緒；大量使用者執行緒複用少量的輕權程序，輕權程序與核心執行緒一一對應。使用者級執行緒在呼叫核心服務時（如檔案讀寫），需要 “捆綁（bound）” 在一個 LWP 上。永久捆綁（一個 LWP 固定被一個使用者級執行緒佔用，該 LWP 移到 LWP 池之外）和臨時捆綁（從 LWP 池中臨時分配一個未被佔用的 LWP）。在呼叫系統服務時，如果所有 LWP 已被其他使用者級執行緒所佔用（捆綁），則該執行緒阻塞直到有可用的 LWP。如果 LWP 執行系統執行緒時阻塞（如 read 呼叫），則當前捆綁在 LWP 上的使用者級執行緒也阻塞。

3.1.2 UNIX International 執行緒的有關 API

執行緒的標頭檔案是。

3.1.2.1 建立使用者級執行緒

int thrcreate (void stackbase, sizet stacksize, void (startroutine，void ), void arg, long flags, threadt new_thr);

其中 flags 包括：THRBOUND（永久捆綁）, THRNEW_LWP（建立新 LWP 放入 LWP 池），若兩者同時指定則建立兩個新 LWP，一個永久捆綁而另一個放入 LWP 池。

3.1.2.2 等待使用者級執行緒

int thrjoin (threadt waitfor, threadt dead, void *status);

3.1.2.3 掛起使用者級執行緒

int thrsuspend (threadt thr);

3.1.2.4 繼續使用者級執行緒

int thrcontinue (threadt thr);

3.1.2.5 退出使用者級執行緒

void thr_exit (void *status);

3.1.2.6 返回當前使用者級執行緒的執行緒識別符號

threadt thrself (void);

3.2 POSIX 執行緒

3.2.1 POSIX 執行緒簡介

執行緒（POSIX threads），簡稱 Pthreads，是執行緒的 POSIX 標準。該標準定義了建立和操縱執行緒的一整套 API。在類 Unix 作業系統（Unix、Linux、Mac OS X 等）中，都使用 Pthreads 作為作業系統的執行緒。Windows 作業系統也有其移植版 pthreads-win32。

3.2.2 POSIX 執行緒的有關 API

執行緒的標頭檔案是。

3.2.2.1 建立使用者執行緒

int pthreadcreate (pthreadt thread, const pthreadattrt attr, void (start_routine)(void ), void arg);

3.2.2.2 等待使用者執行緒

int pthreadjoin (pthreadt thread, void retval);

3.2.2.3 退出使用者執行緒

void pthread_exit (void *retval);

3.2.2.4 返回當前使用者執行緒的執行緒識別符號

pthreadt pthreadself (void);

3.2.2.5 使用者執行緒的取消

int pthreadcancel (pthreadt thread);

3.3 Win32 執行緒

3.3.1 Win32 執行緒簡介

執行緒是 Windows API 的一部分，上下文包括：暫存器、核心棧、執行緒環境塊和使用者棧。

3.3.2 Win32 執行緒的有關 API

執行緒的標頭檔案是，僅適用於 Windows 作業系統。

3.3.2.1 建立使用者執行緒

HANDLE WINAPI CreateThread (LPSECURITYATTRIBUTES lpThreadAttributes, SIZET dwStackSize, LPTHREADSTARTROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId);

3.3.2.2 結束本執行緒

VOID WINAPI ExitThread (DWORD dwExitCode);

3.3.2.3 掛起指定的執行緒

DWORD WINAPI SuspendThread (HANDLE hThread);

3.3.2.4 恢復指定執行緒執行

DWORD WINAPI ResumeThread (HANDLE hThread);

3.3.2.5 等待執行緒執行完畢

DWORD WINAPI WaitForSingleObject (HANDLE hHandle, DWORD dwMilliseconds);

3.3.2.6 返回當前執行緒的執行緒識別符號

DWORD WINAPI GetCurrentThreadId (void);

3.3.2.7 返回當前執行緒的執行緒控制代碼

HANDLE WINAPI GetCurrentThread (void);

跨平臺的執行緒

4.1 C++11 執行緒

4.1.1 C++11 執行緒簡介

2011 年 8 月 12 日，國際標準化組織（ISO）釋出了第三個 C++ 標準，即 ISO/IEC 14882:2011，簡稱 ISO C++ 11 標準。該標準第一次把執行緒的概念引入 C++ 標準庫。Windows 平臺執行的 VS2012 和 Linux 平臺執行的 g++4.7，都完美支援 C++11 執行緒。

4.1.2 C++11 執行緒的有關函式

C++ 11 執行緒的標頭檔案是。

4.1.2.1 建立執行緒

std::thread::thread (Function&& f, Args&&... args);

4.1.2.2 等待執行緒結束

std::thread::join ;

4.1.2.3 脫離執行緒控制

std::thread::detach ;

4.1.2.4 交換執行緒

std::thread::swap (thread& other);

4.2 C11 執行緒

4.2.1 C11 執行緒簡介

2011 年 12 月 8 日，國際標準化組織（ISO）釋出了第三個 C 語言標準，即 ISO 9899:2011，簡稱 ISO C 11 標準。該標準第一次把執行緒的概念引入 C 語言標準庫。

C11 執行緒僅僅是個 “建議標準”，也就是說 100% 遵守 C11 標準的 C 編譯器是可以不支援 C11 執行緒的。根據 C11 標準的規定，只要編譯器預定義了 STDCNOTHREADS(C11)，就可以沒有標頭檔案，自然也就也沒有下列函式。

4.2.2 C11 執行緒的有關函式

C11 執行緒的標頭檔案是。

4.2.2.1 建立執行緒

int thrdcreate (thrdt thr, thrdstartt func, void arg);

4.2.2.2 結束本執行緒

Noreturn void thrdexit (int res);

4.2.2.3 等待執行緒執行完畢

int thrdjoin (thrdt thr, int *res);

4.2.2.4 返回當前執行緒的執行緒識別符號

thrdt thrdcurrent ;

4.3 Java 執行緒

最簡單的情況是，Thread/Runnable 的 run 方法執行完畢，自行終止。
對於更復雜的情況，比如有迴圈，則可以增加終止標記變數和任務終止的檢查點。
最常見的情況，也是為了解決阻塞不能執行檢查點的問題，用中斷來結束執行緒，但中斷只是請求，並不能完全保證執行緒被終止，需要執行執行緒協同處理。
IO 阻塞和等鎖情況下需要透過特殊方式進行處理。
使用 Future 類的 cancel 方法呼叫。
呼叫執行緒池執行器的 shutdown 和 shutdownNow 方法。
守護執行緒會在非守護執行緒都結束時自動終止。
Thread 有 stop 方法，但已不推薦使用。