信號量與普通整型變量的區(qū)別:
①信號量(semaphore)是非負整型變量奸绷,除了初始化之外,它只能通過兩個標準原子操作:wait(semap) , signal(semap) ; 來進行訪問羞迷;
②操作也被成為PV原語(P來源于Dutch proberen"測試",V來源于Dutch verhogen"增加")画饥,而普通整型變量則可以在任何語句塊中被訪問衔瓮;
信號量與互斥鎖之間的區(qū)別:
1. 互斥量用于線程的互斥,信號線用于線程的同步抖甘。
這是互斥量和信號量的根本區(qū)別热鞍,也就是互斥和同步之間的區(qū)別。
互斥:是指某一資源同時只允許一個訪問者對其進行訪問衔彻,具有唯一性和排它性薇宠。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的艰额。
同步:是指在互斥的基礎上(大多數(shù)情況)澄港,通過其它機制實現(xiàn)訪問者對資源的有序訪問。在大多數(shù)情況下柄沮,同步已經(jīng)實現(xiàn)了互斥回梧,特別是所有寫入資源的情況必定是互斥的废岂。少數(shù)情況是指可以允許多個訪問者同時訪問資源
2. 互斥量值只能為0/1,信號量值可以為非負整數(shù)狱意。
也就是說湖苞,一個互斥量只能用于一個資源的互斥訪問,它不能實現(xiàn)多個資源的多線程互斥問題髓涯。信號量可以實現(xiàn)多個同類資源的多線程互斥和同步袒啼。當信號量為單值信號量是,也可以完成一個資源的互斥訪問纬纪。
3. 互斥量的加鎖和解鎖必須由同一線程分別對應使用蚓再,信號量可以由一個線程釋放,另一個線程得到包各。
信號量
信號量(Semaphore)摘仅,有時被稱為信號燈,是在多線程環(huán)境下使用的一種設施, 它負責協(xié)調(diào)各個線程, 以保證它們能夠正確问畅、合理的使用公共資源娃属。
信號量可以分為幾類:
2 二進制信號量(binary semaphore):只允許信號量取0或1值,其同時只能被一個線程獲取护姆。
2 整型信號量(integer semaphore):信號量取值是整數(shù)矾端,它可以被多個線程同時獲得,直到信號量的值變?yōu)?卵皂。
2 記錄型信號量(record semaphore):每個信號量s除一個整數(shù)值value(計數(shù))外秩铆,還有一個等待隊列List,其中是阻塞在該信號量的各個線程的標識灯变。當信號量被釋放一個殴玛,值被加一后,系統(tǒng)自動從等待隊列中喚醒一個等待中的線程添祸,讓其獲得信號量滚粟,同時信號量再減一。
信號量通過一個計數(shù)器控制對共享資源的訪問刃泌,信號量的值是一個非負整數(shù)凡壤,所有通過它的線程都會將該整數(shù)減一。如果計數(shù)器大于0耙替,則訪問被允許亚侠,計數(shù)器減1;如果為0林艘,則訪問被禁止盖奈,所有試圖通過它的線程都將處于等待狀態(tài)。
計數(shù)器計算的結(jié)果是允許訪問共享資源的通行證狐援。因此钢坦,為了訪問共享資源究孕,線程必須從信號量得到通行證, 如果該信號量的計數(shù)大于0爹凹,則此線程獲得一個通行證厨诸,這將導致信號量的計數(shù)遞減,否則禾酱,此線程將阻塞直到獲得一個通行證為止微酬。當此線程不再需要訪問共享資源時,它釋放該通行證颤陶,這導致信號量的計數(shù)遞增颗管,如果另一個線程等待通行證,則那個線程將在那時獲得通行證滓走。
Semaphore可以被抽象為五個操作:
- 創(chuàng)建 Create
- 等待 Wait:
線程等待信號量垦江,如果值大于0,則獲得搅方,值減一比吭;如果只等于0,則一直線程進入睡眠狀態(tài)姨涡,知道信號量值大于0或者超時衩藤。
-釋放 Post
執(zhí)行釋放信號量,則值加一涛漂;如果此時有正在等待的線程赏表,則喚醒該線程。
-試圖等待 TryWait
如果調(diào)用TryWait怖喻,線程并不真正的去獲得信號量底哗,還是檢查信號量是否能夠被獲得岁诉,如果信號量值大于0锚沸,則TryWait返回成功;否則返回失敗涕癣。
-銷毀 Destroy
信號量哗蜈,是可以用來保護兩個或多個關鍵代碼段,這些關鍵代碼段不能并發(fā)調(diào)用坠韩。在進入一個關鍵代碼段之前距潘,線程必須獲取一個信號量。如果關鍵代碼段中沒有任何線程只搁,那么線程會立即進入該框圖中的那個部分音比。一旦該關鍵代碼段完成了,那么該線程必須釋放信號量氢惋。其它想進入該關鍵代碼段的線程必須等待直到第一個線程釋放信號量洞翩。為了完成這個過程稽犁,需要創(chuàng)建一個信號量,然后將Acquire Semaphore VI以及Release Semaphore VI分別放置在每個關鍵代碼段的首末端骚亿。確認這些信號量VI引用的是初始創(chuàng)建的信號量已亥。 動作\系統(tǒng)
Win32
POSIX
創(chuàng)建
CreateSemaphore
sem_init
等待
WaitForSingleObject
sem _wait
釋放
ReleaseMutex
sem _post
試圖等待
WaitForSingleObject
sem _trywait
銷毀
CloseHandle
sem_destroy
互斥量(Mutex)
互斥量表現(xiàn)互斥現(xiàn)象的數(shù)據(jù)結(jié)構,也被當作二元信號燈来屠。一個互斥基本上是一個多任務敏感的二元信號虑椎,它能用作同步多任務的行為,它常用作保護從中斷來的臨界段代碼并且在共享同步使用的資源俱笛。
Mutex本質(zhì)上說就是一把鎖捆姜,提供對資源的獨占訪問,所以Mutex主要的作用是用于互斥迎膜。Mutex對象的值娇未,只有0和1兩個值。這兩個值也分別代表了Mutex的兩種狀態(tài)星虹。值為0, 表示鎖定狀態(tài)零抬,當前對象被鎖定,用戶進程/線程如果試圖Lock臨界資源宽涌,則進入排隊等待平夜;值為1,表示空閑狀態(tài)卸亮,當前對象為空閑忽妒,用戶進程/線程可以Lock臨界資源,之后Mutex值減1變?yōu)?兼贸。
Mutex可以被抽象為四個操作:
- 創(chuàng)建 Create
- 加鎖 Lock
- 解鎖 Unlock
- 銷毀 Destroy
Mutex被創(chuàng)建時可以有初始值段直,表示Mutex被創(chuàng)建后,是鎖定狀態(tài)還是空閑狀態(tài)溶诞。在同一個線程中鸯檬,為了防止死鎖,系統(tǒng)不允許連續(xù)兩次對Mutex加鎖(系統(tǒng)一般會在第二次調(diào)用立刻返回)螺垢。也就是說喧务,加鎖和解鎖這兩個對應的操作,需要在同一個線程中完成枉圃。
不同操作系統(tǒng)中提供的Mutex函數(shù): 動作\系統(tǒng)
Win32
Linyx
Solaris
創(chuàng)建
CreateMutex
pthread_mutex_init
mutex_init
加鎖
WaitForSingleObject
pthread_mutex_lock
mutex_lock
解鎖
ReleaseMutex
pthread_mutex_unlock
mutex_unlock
銷毀
CloseHandle
pthread_mutex_destroy
mutex_destroy