深入理解linux互斥鎖(mutex)
鎖機製,可以說是linux整個係統的精髓所在,linux內核都是圍繞著同步在運轉。在多進程和多線程編程中,鎖起著極其重要的作用。我這裏說的是互斥鎖,其實是泛指linux中所有的鎖機製。我在這裏不講如果創建鎖,關於鎖的創建,網上代碼很多,我在這裏就不多說了。我要談一談一個讓所有剛剛接觸鎖機製的程序員都很困惑的問題:如何使用以及鎖機製在程序中是如何運作的。
為什麼要使用鎖
這個就比較簡單,linux裏麵,鎖的種類很多,包括互斥鎖,文件鎖,讀寫鎖······其實信號量說白了也是一種鎖。使用鎖的目的是達到同步的作用,使共享資源在同一時間內,隻有能有一個進程或者線程對他進行操作。
linux是如何通過鎖來實現對數據的保護和維護的
這個問題是我要將的重點。很多剛剛接觸鎖機製的程序員,都會犯這種錯誤。比如,此時有2個線程,分別是線程A,線程B。A和B共享了資源M。為了同步A和B,使得同一時刻,同意時刻,隻有一個線程對M操作。於是,很自然的會在A中對M資源先lock,等到A對M操作完畢之後,然後做一個操作unlock。B中則因為A加了鎖,B就直接操作M。這個時候,你會發現,B同樣可以操作到M。這個是為什麼呢?
我們利索當然的把檢測鎖的任務交給了操作係統,交給了內核。可以翻看APUE上對於所的講解,其中一部分是這麼寫的:
This mutual-exclusion mechanism works only if we design our threads to follow the same data-access rules. The operating system doesn't serialize access to data for us. If we allow one thread to access a shared resource without first acquiring a lock, then inconsistencies can occur even though the rest of our threads do acquire the lock before attempting to access the shared resource.
這裏This mutual-exclusion mechanism指的就是鎖機製。說的很清楚,隻有程序員設計線程的時候,都遵循同一種數據訪問規則,鎖機製才會起作用。操作係統不會為我們序列化數據訪問,也就是說,操作係統不會為我們擬定任何數據訪問順序,到底是A在先還是B在先,操作係統不會為我們規定。如果我們允許一個線程在沒有多的鎖(lock)之前,就對共享數據進行訪問操作,那麼,即使我們其他的線程都在訪問之前試圖去先鎖住資源(獲取鎖),同樣會導致數據訪問不一致,即多個線程同時在操作共享資源。
從上麵文字可以看出,操作係統不會為我們去檢查,此時是不是有線程已經把資源鎖住了。為了使鎖能夠正常工作,為了保護共享資源,我們隻有在設計線程的時候,所有線程都用同一種方法去訪問共享數據,也就是訪問數據之前,務必先獲取鎖,然後再操作,操作完之後要解鎖(unlock)。操作係統提供鎖機製,就是提供了一種所有程序員都必須遵循的規範。而不是說我們鎖住資源,其他線程訪問共享資源的時候,讓操作係統去為我們檢查數據是否有其他的線程在操作。
版權申明:
轉載文章請注明原文出處https://blog.csdn.net/feiyinzilgd/archive/2010/08/16/5816653.aspx
最後更新:2017-04-02 06:51:23
上一篇:
jsp頁麵顯示新聞.公告之類的上一篇下一篇
下一篇:
Ogre:ManualObject
ReentrantLock
8月24日雲棲精選夜讀:預告|阿裏雲華北5地域將於十月開放服務 全係25G網絡,側重服務人工智能行業
移動互聯網產品設計的原則
PostgreSQL 按需切片的實現(TimescaleDB插件自動切片功能的plpgsql schemaless實現)
Java商戶管理係統 客戶管理 庫存管理 進銷存 springmvc SSM
偽數據科學家 VS 真數據科學家
Spring Boot快速搭建Web項目基本框架
MySQL8.0新特性隨筆: NOWAIT以及SKIP LOCKED
Java優先隊列(PriorityQueue)示例
換一種思路,服務器數據中心將更加強大