一、線程基本概念
線程是進程內的一個執行單元,多個線程共享進程的資源(如內存、文件描述符等),但每個線程擁有自己的寄存器、棧等。與進程相比,線程的創建、切換開銷較小,能更高效地利用 CPU 資源。
二、線程創建與終止
-
創建 :在 Linux 下,使用 pthread 庫的 pthread_create 函數創建線程。函數原型為 int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg); 參數 thread 存儲創建成功后的線程 ID,attr 為線程屬性(NULL 表示默認屬性),start_routine 是線程執行的函數,arg 為傳遞給執行函數的參數。
-
終止 :線程可通過多種方式終止。一種是線程函數執行完畢正常退出;二是調用 pthread_exit 函數,參數用于返回線程的退出狀態;三是其他線程調用 pthread_cancel 函數來終止指定線程。
三、線程同步與互斥
-
互斥鎖(Mutex) :防止多個線程同時訪問共享資源。使用 pthread_mutex_init 初始化互斥鎖,pthread_mutex_lock 鎖定互斥鎖,pthread_mutex_unlock 解鎖。需要注意避免死鎖問題,如不同線程按不同順序加鎖。
-
條件變量 :讓線程等待某個條件滿足再繼續執行。與互斥鎖配合使用,pthread_cond_wait 會阻塞線程,直到另一個線程發出 pthread_cond_signal 或 pthread_cond_broadcast 信號。
-
讀寫鎖(RWLock) :允許多個線程同時讀共享數據,但寫操作時只能有一個線程訪問。適用于讀操作多于寫操作的場景,通過 pthread_rwlock_t 類型及相關操作函數實現。
四、線程屬性設置
線程創建時可以設置屬性,如分離狀態(通過 pthread_attr_setdetachstate)。分離線程在終止時自動釋放資源,而非分離線程需其他線程通過 pthread_join 來回收資源。
五 、線程局部存儲(TLS)
為每個線程提供獨立的變量副本,避免共享變量的同步問題。使用 pthread_key_create 創建鍵,pthread_setspecific 設置線程局部變量,pthread_getspecific 獲取變量。
六、線程池
線程池預先創建一定數量的線程,避免頻繁創建和銷毀線程的開銷。任務放入任務隊列,線程從隊列中獲取任務執行。Linux 下可借助第三方庫或自己實現簡單的線程池。
七、性能優化與注意事項
-
合理控制線程數量,避免過度線程化導致上下文切換頻繁。
-
在同步機制中,盡量減少鎖的粒度,使用更高效的同步策略,如無鎖編程(適用于簡單場景,部分應用場景下性能更優)。
八、實際應用案例
-
在服務器開發中,使用多線程處理多個客戶端連接,每個線程負責與一個客戶端通信。
-
多媒體處理中,不同線程負責數據讀取、處理、輸出等不同階段,提高處理效率。