Linux系統程式設計 執行緒同步概念

2021-10-10 10:41:07 字數 1112 閱讀 1914

同步概念

同步,指對在乙個系統中所發生的事件之間進行協調,在時間上出現一致性與統一化的現象。

但是,對於不同行業,對於同步的理解略有不同。比如:裝置同步,是指在兩個裝置之間規定乙個共同的時間參考;資料庫同步,是指讓兩個或多個資料庫內容保持一致,或者按需要部分保持一致;檔案同步,是指讓兩個或多個資料夾裡的檔案保持一致,等等。

但是,在軟體程式設計或者通訊行業中所說的同步與生活中大家印象中的同步概念略有差異。「同」字應是指協同、協助、互相配合。主旨在協同步調,按預定的先後次序執行。注意,這裡是指按照預定次序執行,而不是同時執行。

執行緒同步

執行緒同步,指乙個執行緒發出某一功能呼叫時,在沒有得到結果之前,該呼叫不返回。同時其它執行緒為保證資料一致性,不能呼叫該功能。

例子: 記憶體中開闢了100位元組的空間,現在,執行緒t1欲填入全1,執行緒t2欲填入全0。但如果t1執行了填充50個位元組全1後失去cpu,輪到t2執行,t2將從頭開始在記憶體裡填充全0,那麼他將會將t1寫過的內容覆蓋。當t2時間片使用完畢之後,t1再次獲得cpu繼續從失去cpu的位置向後寫入1,當他執行結束後,記憶體中的100位元組,既不是全1,也不是全0,如下圖示:

產生的這種現象叫做「與時間有關的錯誤」(time related)。為了避免這種資料混亂,執行緒需要進行同步。

「同步」的目的,是為了避免資料混亂,解決與時間有關的錯誤。實際上,不僅執行緒間需要同步,程序間、訊號間等等都需要同步機制。

因此,所有「多個控制流,共同操作乙個共享資源」的情況,都需要同步。

由以上分析可知,造成資料混亂原因有以下三個:

資源共享(獨享資源則不會)

. 排程隨機(意味著資料訪問會出現競爭)

執行緒間缺乏必要的同步機制。

那如何避免這種資料混亂的情況呢?我們可以從造成資料混亂的三個原因入手。

以上3點中,前兩點我們是無法改變的。因為在linux系統中,想要提高效率,傳遞資料,資源必須共享。只要共享資源,就一定會出現競爭。只要存在競爭關係,資料就很容易出現混亂。

所以只能從第三點著手解決。為了避免資料混亂,應該使多個執行緒在訪問共享資源的時候,出現互斥。也就是說,當某個程序訪問共享資源時,其它程序就無法該資源,直到該程序放棄這個資源。在linux環境下,有訊號量、互斥量、條件變數等方式實現執行緒間同步。在後續的博文中,將依次介紹這些內容。

Linux系統程式設計 同步和互斥的概念

現代作業系統基本都是多工作業系統,即同時有大量可排程實體在執行。在多工作業系統中,同時執行的多個任務可能 這兩種情形是多工程式設計中遇到的最基本的問題,也是多工程式設計中的核心問題,同步和互斥就是用於解決這兩個問題的。互斥 是指散步在不同任務之間的若干程式片斷,當某個任務執行其中乙個程式片段時,其它...

linux系統程式設計 執行緒

include int pthread create pthread t thread,const pthread attr t attr,void start routine void void arg include include include include include include...

linux系統程式設計 執行緒同步 條件變數 cond

執行緒同步 條件變數 cond 再引入條件變數之前,我們先看下生產者和消費者問題 生產者不斷地生產產品,同時消費者不斷地在消費產品。這個問題的同步在於兩處 第一,消費者之間需要同步 同一件產品只可由一人消費。第二,當無產品可消費時,消費者需等待生產者生產後,才可繼續消費,這又是乙個同步問題。詳細了解...