欧美亚洲中文,在线国自产视频,欧洲一区在线观看视频,亚洲综合中文字幕在线观看

      1. <dfn id="rfwes"></dfn>
          <object id="rfwes"></object>
        1. 站長資訊網(wǎng)
          最全最豐富的資訊網(wǎng)站

          信號量和互斥量的區(qū)別是什么

          區(qū)別:1、互斥量用于線程的互斥,信號量用于線程的同步;2、互斥量值只能為0或1,信號量值可以為非負(fù)整數(shù);3、互斥量的加鎖和解鎖必須由同一線程分別對應(yīng)使用,信號量可以由一個線程釋放,另一個線程得到。

          信號量和互斥量的區(qū)別是什么

          本教程操作環(huán)境:windows7系統(tǒng)、Dell G3電腦。

          互斥量和信號量的區(qū)別

          1. 互斥量用于線程的互斥,信號量用于線程的同步。

          這是互斥量和信號量的根本區(qū)別,也就是互斥和同步之間的區(qū)別。

          互斥:是指某一資源同時只允許一個訪問者對其進(jìn)行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。

          同步:是指在互斥的基礎(chǔ)上(大多數(shù)情況),通過其它機制實現(xiàn)訪問者對資源的有序訪問。在大多數(shù)情況下,同步已經(jīng)實現(xiàn)了互斥,特別是所有寫入資源的情況必定是互斥的。少數(shù)情況是指可以允許多個訪問者同時訪問資源

          2. 互斥量值只能為0/1,信號量值可以為非負(fù)整數(shù)。

          也就是說,一個互斥量只能用于一個資源的互斥訪問,它不能實現(xiàn)多個資源的多線程互斥問題。信號量可以實現(xiàn)多個同類資源的多線程互斥和同步。當(dāng)信號量為單值信號量是,也可以完成一個資源的互斥訪問。

          3. 互斥量的加鎖和解鎖必須由同一線程分別對應(yīng)使用,信號量可以由一個線程釋放,另一個線程得到。

          互斥量(Mutex)

          互斥量表現(xiàn)互斥現(xiàn)象的數(shù)據(jù)結(jié)構(gòu),也被當(dāng)作二元信號燈。一個互斥基本上是一個多任務(wù)敏感的二元信號,它能用作同步多任務(wù)的行為,它常用作保護從中斷來的臨界段代碼并且在共享同步使用的資源。

          信號量和互斥量的區(qū)別是什么

          Mutex本質(zhì)上說就是一把鎖,提供對資源的獨占訪問,所以Mutex主要的作用是用于互斥。Mutex對象的值,只有0和1兩個值。這兩個值也分別代表了Mutex的兩種狀態(tài)。值為0, 表示鎖定狀態(tài),當(dāng)前對象被鎖定,用戶進(jìn)程/線程如果試圖Lock臨界資源,則進(jìn)入排隊等待;值為1,表示空閑狀態(tài),當(dāng)前對象為空閑,用戶進(jìn)程/線程可以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)用立刻返回)。也就是說,加鎖和解鎖這兩個對應(yīng)的操作,需要在同一個線程中完成。

          不同操作系統(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

          死鎖主要發(fā)生在有多個依賴鎖存在時, 會在一個線程試圖以與另一個線程相反順序鎖住互斥量時發(fā)生. 如何避免死鎖是使用互斥量應(yīng)該格外注意的東西。

            總體來講, 有幾個不成文的基本原則:

            對共享資源操作前一定要獲得鎖。

            完成操作以后一定要釋放鎖。

            盡量短時間地占用鎖。

            如果有多鎖, 如獲得順序是ABC連環(huán)扣, 釋放順序也應(yīng)該是ABC。

            線程錯誤返回時應(yīng)該釋放它所獲得的鎖。

          也許還有讀者好奇,“掛起等待”和“喚醒等待線程”的操作如何實現(xiàn)?每個Mutex有一個等待隊列,一個線程要在Mutex上掛起等待,首先在把自己加入等待隊列中,然后置線程狀態(tài)為睡眠,然后調(diào)用調(diào)度器函數(shù)切換到別的線程。一個線程要喚醒等待隊列中的其它線程,只需從等待隊列中取出一項,把它的狀態(tài)從睡眠改為就緒,加入就緒隊列,那么下次調(diào)度器函數(shù)執(zhí)行時就有可能切換到被喚醒的線程。

          一般情況下,如果同一個線程先后兩次調(diào)用lock,在第二次調(diào)用時,由于鎖已經(jīng)被占用,該線程會掛起等待別的線程釋放鎖,然而鎖正是被自己占用著的,該線程又被掛起而沒有機會釋放鎖,因此就永遠(yuǎn)處于掛起等待狀態(tài)了,這叫做死鎖(Deadlock)。另一種典型的死鎖情形是這樣:線程A獲得了鎖1,線程B獲得了鎖2,這時線程A調(diào)用lock試圖獲得鎖2,結(jié)果是需要掛起等待線程B釋放鎖2,而這時線程B也調(diào)用lock試圖獲得鎖1,結(jié)果是需要掛起等待線程A釋放鎖1,于是線程A和B都永遠(yuǎn)處于掛起狀態(tài)了。不難想象,如果涉及到

          贊(0)
          分享到: 更多 (0)
          網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號