歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux基礎知識

linux線程控制&線程分離

線程概念

線程,有時被稱為輕量級進程(Lightweight Process,LWP),是程序執行流的最小單元。

線程是程序中一個單一的順序控制流程。進程內一個相對獨立的、可調度的執行單元,是系統獨立調度和分派CPU的基本單位指運行中的程序的調度單位。在單個程序中同時運行多個線程完成不同的工作,稱為多線程。

線程資源

由於一個程序中的多個線程共享同一地址空間,因此代碼段,數據段內容是共享的。除此之外,以下內容也是共享的:

1. 文件描述符表
2. 每種信號的處理方式(SIG_IGN、SIG_DFL或者自定義的信號處理函數)
3. 當前工作目錄
4. 用戶id和組id

但有些資源是每個線程各有一份的:

1. 線程id

2.上下文,包括各種寄存器的值、程序計數器和棧指針
3. 棧空間
4. errno變量
5. 信號屏蔽字
6. 調度優先級

 

線程控制

創建:int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);
獲取線程id:pthread_t pthread_self(void);

終止線程

如果需要只終止某個線程而不終止整個進程,可以有三種方法:
1. 從線程函數return。這種方法對主線程不適用,從main函數return相當於調用exit。//線程return
2. 一個線程可以調用pthread_cancel終止同一進程中的另一個線程。//被動終止
3. 線程可以調用pthread_exit終止自己。//自己終止

等待線程

       int pthread_join(pthread_t thread, void **retval);
調用該函數等待的線程將掛起等待,直到id為thread的線程終止。線程以不同方式終止,pthread_join得到的結果是不同的。具體如下:

1線程以return方式終止,那麼retval指向的單元保存的是thread函數的返回值

2如果進程被pthread_cancel方式終止,那麼retval保存的是常數PTHREAD_CANCELED

3如果進程是pthread_exit方式終止自己,那麼reval保存用戶傳給exit的參數

注:對於線程進行join之後線程的狀態將是detach狀態(分離),同樣的pthread_cancel函數可以對線程進行分離處理。所以,不能同時對一個線程進行join和detach操作

線程分離

在任意一個時間點上,線程是可結合(joinable)或者是可分離的(detached)。一個可結合線程是可以被其他線程收回資源和殺死的。在被回收之前,他的存儲器資源(棧等)是不釋放的。而對於detached狀態的線程,其資源不能被別的線程收回和殺死,只有等到線程結束才能由系統自動釋放

默認情況,線程狀態被設置為結合的。所以為了避免資源洩漏等問題,一個線程應當是被顯示的join或者detach的,否則線程的狀態類似於進程中的Zombie Process。會有部分資源沒有被回收的。

調用函數pthread_join,當等待線程沒有終止時,主線程將處於阻塞狀態。如果要避免阻塞,那麼

在主線程中加入代碼pthread_detach(thread_id)

或者在被等待線程中加入pthread_detach(thread_self())

Copyright © Linux教程網 All Rights Reserved