線程(創建、終止、等待、分離、同步、互斥)


 

進程在各自在自己的地址空間中運行,進程間通信要通過進程間通信機制實現,但是一個進程的地址空間中可以執行多個線程,這些線程除了共享數據段還共享文件描述符表,用戶id組id,和當前工作目錄,errno變量。但同一進程中的線程還有其所獨有的:線程id、上下文(寄存器、程序計數器、棧指針)、調度優先級、等等。

線程的創建函數:

int pthread_create(pthread_t*thread,const pthread_att_t*attr,void*(*start_routine)(void*),void*arg);

若成功返回0,錯誤返回錯誤號,當一個線程調用此函數繼續往下執行,新的線程所執行的代碼由函數指針start_routine決定,start_routine接受一個通過pthread_creat函數傳進來的void*類型參數arg,start_routine返回時此線程結束。別的線程調用pthread_join得到start_routine的返回值。

線程的終止:

1、從線程函數返回(main函數除外)

2、一個線程調用pthread_cancel終止同一進程中的另一線程

3、線程調用pthread_exit(void *retval)終止自己

線程的等待:

int pthread_join(pthread_t thread,void **retval)

調用該函數的線程將掛起等待,直到id為thread的線程終止

查看線程不同終止方式返回,value_ptr所指向的內存的值:

運行結果:

 線程的分離:

線程終止后,線程狀態一直保留到其他線程調用pthread_join獲取狀態為止,但線程也可以被置detach狀態,這樣一旦終止就立刻回收它所占有的資源,而不保留終止狀態。

分離函數:int pthread_detach(pthread_t thread);

可結合的線程能被其它線程收回其資源和殺死,被其他線程回收之前,存儲器資源不釋放,一個分離的線程是不能被其他線程回收或殺死的,它的存儲器資源在終止時由系統自動釋放。

 調用pthread_join后,如果線程沒有運行結束,調用者會被阻塞,但有時當主線程創建多個子線程進行處理,並不像希望調用pthread_join阻塞,這時就可以置線程為分離狀態,這樣一來線程運行結束后會自動釋放資源。

運行結果:(證明分離的線程狀態不能調用pthread_join函數)

線程的同步:

多線程的程序,訪問沖突很普遍,可以引入互斥鎖(Mutex),獲得鎖的線程可以進行讀寫修改操作,然后釋放鎖給其它線程。

A:實現互斥鎖的操作:

lock:

      movb $0,%al

     xchgb %al,mutex

if(al寄存器的內容>0){

      return 0;

}else 

     掛起等待;

goto lock;

unlock:

    movb $1 ,mutex

    喚醒等待Mutex的線程;

return 0;

其中“掛起等待”和“喚醒等待線程”的實現:每個Mutex有一個等待隊列,一個線程要在Mutex上掛起等待,首先要將自己加入到等待隊列中,然后置線程為睡眠狀態,然后調用調度器函數切換到別的線程,一個線程要喚醒等待隊列中的其他線程,只需從等待隊列中取出一項,將睡眠狀態改為就緒,加入就緒隊列。

引起死鎖的兩種典型情況:

如果所有線程在需要多個鎖時都按相同的先后順序(常見的是按Mutex變量的地址順序)獲得鎖,則不會出現死鎖。也可以使用pthread_mutex_trylock調用替代pthread_mutex_lock

 B:條件變量

線程間的同步還有這樣這種情況:線程A需要等某個條件成立才能繼續往下執行,現在這個條
件不成立,線程A就阻塞等待,而線程B在執行過程中使這個條件成立了,就喚醒線程A繼續執

C:Semaphore(信號量)

信號量和Mutex類似,表示可用資源的數量,信號量的數量大於1。

int sem_init(sem_t *sem,int pshared,unsigned int value);value:可用資源數量;pshared=0,表示同一進程的線程同步

int sem_wait(sem_t *sem);semaphore減1,如果調用時已經為0,則掛起等待

int sem_trywait(sem_t *sem);

int sem_post(sem_t *sem);釋放資源,semaphore加1

int sem_destory(sem_t *sem);

D:讀寫鎖

一個讀寫鎖只能有一個寫者或多個讀者,但不能即有讀者又有寫者。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM