當啟動一個程式時,作業系統建立一個進程,並在該進程中執行程式。
一個進程包括一個或多個執行緒。每個執行緒又是一個區域性進程,它以獨立於其他區域性進程的方式執行一個命令序列。
當進程啟動時,它的主執行緒則成為活動執行緒。這時,任何正在執行的執行緒都可以啟動其他執行緒。
當進程終止時,例如,通過在 main()函數中執行一個 return 語句或通過呼叫 exit()函數,
所有已開啟但還未結束的執行緒都會被終止。
系統排程器為所有可執行的執行緒平均分配可用的 CPU 時間。通常,排程器是搶占式的:它會中斷正在執行的執行緒,給中央處理單元(CPU)留出可用的短暫時間,並將 CPU 分配給其他執行緒使用一段時間。
這種排程的結果是:即使是在單處理系統上,在使用者面前執行的執行緒看上去像是在同時執行,實際上,只有在多處理器系統中,幾個執行緒才可能真正地同時執行。
每一個進程在記憶體中都有自己的地址空間,並擁有獨佔的資源,例如,開啟的檔案。一個進程中的所有執行緒都繼承該進程的資源。最具有意義的是,在一個進程中的幾個執行緒共用一個地址空間。這使得在一個進程中的工作切換比在不同進程間的工作切換要簡單得多。
然而
,為了在不同執行緒間切換任務,每個執行緒也擁有自己的資源:包括棧記憶體和 CPU 暫存器。這些資源允許每個執行緒在不受其他執行緒干擾的條件下,處理自身的本地資料。此外,一個執行緒也可以具有執行緒專用的永久記憶體。
對於一個給定進程,由於它內部的所有執行緒均使用相同的地址空間,所以它們共用全域性資料與靜態資料。然而,這也意味著,同一個進程中的兩個不同執行緒可以同時存取同一個記憶體單元。這種情況在 C 標準中被稱為
資料競爭(data race),或者通常稱之為
競態條件(race condition)。
為了防止在共用資料時出現衝突,當這些不同執行緒使用記憶體中相同位置時,程式設計師必須明確地同步這些不同執行緒的寫操作或讀寫操作。