執行緒庫為程式設計師提供建立和管理執行緒的 API。實現執行緒庫的主要方法有兩種:
-
在使用者空間中提供一個沒有核心支援的庫。這種庫的所有程式碼和資料結構都位於使用者空間。這意味著,呼叫庫內的一個函數只是導致了使用者空間內的一個本地函數的呼叫,而不是系統呼叫。
-
實現由作業系統直接支援的核心級的一個庫。對於這種情況,庫內的程式碼和資料結構位於核心空間。呼叫庫中的一個API函數通常會導致對核心的系統呼叫。
目前使用的三種主要執行緒庫是:POSIX Pthreads、Windows 和 Java:
-
Pthreads 作為 POSIX 標準的擴充套件,可以提供使用者級或核心級的庫;
-
Windows 執行緒庫是用於 Windows 作業系統的核心級執行緒庫;
-
Java 執行緒 API 允許執行緒在 Java 程式中直接建立和管理。然而,由於大多數 JVM 範例執行在宿主作業系統之上,Java 執行緒 API 通常採用宿主系統的執行緒庫來實現。這意味著在 Windows 系統上,Java 執行緒通常採用 Windows API 來實現,而在 UNIX 和 Linux 系統中採用 Pthreads 來實現。
對於 POSIX 和 Windows 執行緒,全域性宣告(即在函數之外宣告的)的任何資料,可為同一進程的所有執行緒共用。因為 Java 沒有全域性資料的概念,所以執行緒對共用資料的存取必須加以顯式安排。屬於某個函數的本地資料通常位於堆疊。由於每個執行緒都有自己的堆疊,每個執行緒都有自己的本地資料。
在本節的餘下部分中,我們將通過這三種執行緒庫介紹簡單的執行緒建立。作為一個說明例子,我們設計了一個多執行緒程式,以便執行非負整數的求和,這裡採用了著名的求和函數: