執行緒基礎 同步機制

2021-06-22 07:12:10 字數 3918 閱讀 1420

1.  執行緒基礎

概念

1). 執行緒全稱控制線程

2). 多執行緒的優勢:

a) 比程序方便,可以共享相同的記憶體空間及檔案描述符

b) 可以用於多個任務,而這些任務如果用單程序來實現是序列,

在多執行緒裡面由於cpu的排程可以實現穿插執行

c) 用於互動程式,將使用者輸入輸出與其他部分分開,優化效能

3). 如何知道系統是否多執行緒pthread(posix執行緒)

a) #ifdef  _posix_threads

b) sysconf(_sc_threads)

4). 乙個

執行緒的資料結構

執行緒id,  一組暫存器, 棧, 排程優先順序, 訊號遮蔽字, errno,  私有資料

pthread_t 被實現為結構體這種才是可移植的

但linux 直接這樣定義了 typedef unsigned long int pthread_t;

函式

1).執行緒id比較

pthread_equal(pthread_t ptd1, pthread_t ptd2)

獲得執行緒id pthread_self(void)

2).執行緒建立

pthread_create(新執行緒的id,執行緒的屬性,執行緒執行位址,函式引數)

**** 新執行緒和主線程在建立後是競爭執行

**** linux上是靠clone建立子程序來實現pthread_create, 所以同乙個程序裡面的執行緒獲取到pid (程序號)可能不同(乙個來自當前程序,乙個來自子程序)(fedora8是相同的)

3).執行緒終止

如果任一線程呼叫了exit,_exit,_exit,那麼

整個程序就會終止

a)從啟動函式返回     return 

b)被其他執行緒取消     pthread_cancel

c)執行緒呼叫pthread_exit. 

主線程呼叫時,會等待對等執行緒結束後再結束主線程

4).執行緒阻塞

pthread_join (pthread_t aim_ptd)  

阻塞當前執行緒一直到目標執行緒退出 類似於程序控制裡面的 wait

不能對分離狀態(設定為,或已經是detach狀態)的執行緒使用pthread_join, 會返回失敗

只有乙個執行緒可以對某個執行緒使用pthread_join

5).請求取消某個執行緒

pthread_cancel  提出申請,並不等待

6). 登記執行緒退出清理函式,

類似於atexit登記函式

pthread_cleanup_push(函式指標,引數)

除了pthread_exit, 及響應取消請求而退出的時候執行清理函式,也可以呼叫pthread_cleanup_pop來執行函式。

執行緒return退出是

不會執行清理函式的

pthread_cleanup_pop(int execute) execute為0就不執行清理函式,只是刪除該處理函式,必須大於0才呼叫

7).分離執行緒  pthread_detach

pthread_t       tid;

pthread_attr_t  attr;

pthread_attr_init(&attr);

pthread_attr_setdetachstate(&attr, pthread_create_detached);

pthread_create(&tid, &attr, thread_function, arg);

2.  執行緒同步

原因: 現代計算機體系結構造成了資料不是順序一致來實現, 還有程式裡面的邏輯,不是原子操作而造成的

1). 互斥量  本質上就是多放一塊全域性條件變數

pthread_mutex_t 訪問前加鎖,訪問完解鎖

使用步驟:

a)建立並初始化

靜態的pthread_mutex_t 賦值常量 pthread_mutex_initializer

動態分配的pthread_mutext_t ,需要呼叫pthread_mutex_init初始化, pthread_mutex_destroy釋放

通過pthread_mutex_init可以指定互斥量的屬性,預設屬性輸入引數null

b)加鎖

pthread_mutex_lock,如果已經有鎖則阻塞到互斥變數解鎖

嘗試加鎖 pthread_mutex_trylock  加鎖不成功會馬上返回 ebusy       

c)訪問資料 

d)解鎖  

pthread_mutex_unlock 解鎖

2). 

避免互斥量死鎖

產生的原因: 

1.同乙個執行緒對同乙個互斥量加鎖2次,執行緒本身會陷入死鎖, 

2. 多個互斥量被多個執行緒以相反的順序訪問的時候

3). 讀寫鎖 又名 共享-獨佔鎖

型別:        讀鎖 寫鎖

資料型別: pthread_rwlock_t

存在條件: 寫鎖一次最多乙個執行緒佔據,讀鎖可以並行存在多個

加鎖條件:

a)當前鎖是寫鎖,所有其它新加鎖都會被阻塞

b)當前鎖是讀鎖,如果新加鎖是讀鎖,那麼可以獲得訪問許可權

c)當前鎖是讀鎖,如果新加鎖是寫鎖,那麼該鎖會被阻塞直到所有讀鎖解鎖。

****注意為避免長期的讀鎖佔據寫的時間,但有寫鎖進來後,後續的讀鎖都會被拒絕掉

****適合讀的次數大於寫的次數的情況

初始化及釋放:

pthread_rwlock_init

pthread_rwlock_destroy

加鎖及解鎖

pthread_rwlock_rdlock

pthread_rwlock_wrlock

pthread_rwlock_unlock 

嘗試加鎖

pthread_rwlock_tryrdlock

pthread_rwlock_trywrlock

4). 條件變數

資料型別 pthread_cond_t

需要 和互斥變數一起使用,受到互斥變數的保護

靜態初始化 賦值常量 pthread_cond_initializer

動態初始化和釋放

pthread_cond_init pthread_cond_destroy

作用:給多個執行緒提供了乙個會合的場所,允許執行緒以無競爭的方式等待特定的條件發生

pthread_cond_wait

目的: 是通過互斥量的保護,將執行緒加入到某個等待條件的執行緒佇列裡面去

過程: 進入函式前,呼叫者將鎖住的互斥量傳給函式

函式內部,將執行緒加入到佇列並解鎖      //如果條件不滿足此時掛起,並釋放鎖

函式返回,再次對互斥量加鎖

即:進入函式先檢測,如果條件滿足則執行,不滿足則阻塞。在阻塞執行緒之前,

pthread_cond_wait 與 

pthread_cond_timedwait 先釋放與條件相關的互斥量,

允許其他執行緒獲取互斥量、改變條件、釋放互斥量並向條件變數傳送訊號。

pthread_cond_timedwait

同上,但是有個時間等待限制,時間是絕對值,即具體的時刻,資料型別 timespec

喚醒等待條件的執行緒:

pthread_cond_signal 喚醒等待某個條件的乙個執行緒

pthread_cond_broadcast 喚醒等待某個條件的所有執行緒

學習條件變數用法的2個例子

執行緒同步機制

本週主要學習 執行緒同步機制 互斥量 讀寫鎖和條件變數 和簡單程式的實現,對執行緒同步有了進一步認識 內容如下 執行緒的基本概念,相關函式 互斥量 說明 處於標圓形框之上的線段表示相關的執行緒沒有擁有互斥量 處於圓形框中心線之上的線段表示相關的執行緒等待互斥量 處於圓形框中心線之下的線段表示相關的執...

執行緒同步機制

執行緒同步主要用於協調對臨界資源的訪問,臨界資源可以是硬體裝置 比如印表機 磁碟 檔案 記憶體 變數 陣列 佇列等 執行緒同步有4種機制 他們的主要區別在於 各同步機制詳細的功能說明如下 臨界區臨界區是一段獨佔對某些共享資源訪問的 在任意時刻只允許乙個執行緒對共享資源進行訪問。如果有多個執行緒試圖同...

執行緒同步機制

執行緒同步的四種機制 主要區別在於 適用範圍 臨界區在使用者模式下,不會發生使用者態到核心態的切換,只能用於同程序內線程間同步。其他會導致使用者態到核心態的切換,利用核心物件實現,可用於不同程序間的執行緒同步。效能 臨界區效能較好,一般只需要數個cpu週期。其他機制效能相對較差,一般需要數十個cpu...