同步概念
同步,指對在一個系統中所發生的事件之間進行協調,在時間上出現一致性與統一化的現象。
但是,對於不同行業,對於同步的理解略有不同。比如:設備同步,是指在兩個設備之間規定一個共同的時間參考;數據庫同步,是指讓兩個或多個數據庫內容保持一致,或者按需要部分保持一致;文件同步,是指讓兩個或多個文件夾里的文件保持一致,等等。
但是,在軟件編程或者通信行業中所說的同步與生活中大家印象中的同步概念略有差異。“同”字應是指協同、協助、互相配合。主旨在協同步調,按預定的先后次序運行。注意,這里是指按照預定次序執行,而不是同時執行。
線程同步
線程同步,指一個線程發出某一功能調用時,在沒有得到結果之前,該調用不返回。同時其它線程為保證數據一致性,不能調用該功能。
例子: 內存中開辟了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,公眾內回復1024可免費獲得5T技術資料,包括:Linux,C/C++,Python,樹莓派,嵌入式,Java,人工智能,等等。公眾號內回復進群,邀請您進高手如雲技術交流群。
公眾號:良許Linux
