所謂互斥,就是不同執行緒通過競爭進入臨界區(共享的資料和硬體資源),為了防止訪問衝突,在有限的時間內只允許其中之一獨占性的使用共享資源。如不允許同時寫
同步關係則是多個執行緒彼此合作,通過一定的邏輯關係來共同完成乙個任務。一般來說,同步關係中往往包含互斥,同時對臨界區的資源會按照某種邏輯順序進行訪問。如先生產後使用
總的來說,兩者的區別就是:
互斥是通過競爭對資源的獨佔使用,彼此之間不需要知道對方的存在,執行順序是乙個亂序。
同步是協調多個相互關聯執行緒合作完成任務,彼此之間知道對方存在,執行順序往往是有序的。
1、 訊號量:
用在多執行緒多工同步的,乙個執行緒完成了某乙個動作就通過訊號量告訴別的執行緒,別的執行緒再進行某些動作(大家都在semtake的時候,就阻塞在 **)。
2、互斥鎖:
用在多執行緒多工互斥的,乙個執行緒占用了某乙個資源,那麼別的執行緒就無法訪問,直到這個執行緒unlock,其他的執行緒才開始可以利用這 個資源。比如對全域性變數的訪問,有時要加鎖,操作完了,在解鎖。有的時候鎖和訊號量會同時使用的
也就是說,訊號量不一定是鎖定某乙個資源,而是流程上的概念(有序),比如:有a,b兩個執行緒,b執行緒要等a執行緒完成某一任務以後再進行自己下面的步驟,這個任務 並不一定是鎖定某一資源,還可以是進行一些計算或者資料處理之類。而執行緒互斥量則是「鎖住某一資源」的概念,在鎖定期間內,其他執行緒無法對被保護的資料進行操作。在有些情況下兩者可以互換。
沒有等待執行緒的解鎖或激發條件都是沒有意義的,而沒有等待燈亮的執行緒的點燈操作則有效,且能保持燈亮狀態。當然,這樣的操作原語也意味著更多的開銷。
互斥量和訊號量的區別:
1、互斥量用於執行緒的互斥,訊號量用於執行緒的同步。
2、作用域:
訊號量: 程序間(system v訊號量、posix有名訊號量)、執行緒間(posix 無名訊號量)
互斥鎖: 執行緒間
3、互斥量值只能為0/1,訊號量值可以為非負整數(二元燈、多元燈)。
4、互斥量的加鎖和解鎖必須由同一執行緒分別對應使用,訊號量可以由乙個執行緒釋放,另乙個執行緒得到。
互斥量與訊號量(互斥與同步)
互斥量 mutex 互斥量表現互斥現象的資料結構,也被當作二元訊號燈。乙個互斥基本上是乙個多工敏感的二元訊號,它能用作同步多工的行為,它常用作保護從中斷來的臨界段 並且在共享同步使用的資源。mutex本質上說就是一把鎖,提供對資源的獨佔訪問,所以mutex主要的作用是用於互斥。mutex物件的值,只...
執行緒同步與互斥 訊號量
關於訊號量,我們在前面程序間通訊也談到過,今天我們再來看看使用訊號量實現執行緒間的同步與互斥問題。再來說說什麼是訊號量?號量的操作函式。sem init 用來初始化乙個訊號量,sem t sem是自己定義的sem變數的位址,pshared引數為0,用於表示訊號量用於同一程序間的執行緒間同步,valu...
訊號量與互斥鎖
訊號量與普通整型變數的區別 訊號量 semaphore 是非負整型變數,除了初始化之外,它只能通過兩個標準原子操作 wait semap signal semap 來進行訪問 操作也被成為pv原語 p 於dutch proberen 測試 v 於 dutch verhogen 增加 而普通整型變數則...