spinlock和mutex的區(qū)別 多線(xiàn)程中Semaphore,mutex和lock的區(qū)別?
多線(xiàn)程中Semaphore,mutex和lock的區(qū)別?mutex計(jì)數(shù)有三個(gè)可能的值?!?”表示解鎖,“0”表示lokced,負(fù)值表示可能的等待。Tmutex有以下約定:只有一個(gè)進(jìn)程可以進(jìn)行。T/只有
多線(xiàn)程中Semaphore,mutex和lock的區(qū)別?
mutex計(jì)數(shù)有三個(gè)可能的值。”1”表示解鎖,“0”表示lokced,負(fù)值表示可能的等待。Tmutex有以下約定:只有一個(gè)進(jìn)程可以進(jìn)行。T/只有所有者本身可以解鎖mutex(所有者指針的函數(shù))。不允許T/T遞歸鎖。但是,信號(hào)量是允許的。在mysql之前,有一個(gè)bug:bug?24745 InnoDB semaphore wait timeout/crash–死鎖等待自身。它只能通過(guò)API初始化,不能通過(guò)memset和復(fù)制。當(dāng)一個(gè)互斥鎖被持有時(shí),進(jìn)程通常不會(huì)退出;持有互斥鎖的內(nèi)存不能被釋放。T/T通常不用于硬件和軟件中斷。5. 綜上所述,我們可以看到信號(hào)量一般只表示資源量和信息量,這類(lèi)似于解決生產(chǎn)者-消費(fèi)者和同步信號(hào)傳輸?shù)膯?wèn)題。它不能解決序列化問(wèn)題?;コ怄i是為了解決互斥問(wèn)題,保證資源或代碼片段的串行訪(fǎng)問(wèn),因?yàn)橹挥兴姓卟拍茚尫沛i。另外,一些學(xué)生可能會(huì)問(wèn)二進(jìn)制信號(hào)量只有兩個(gè)可能的值,這也可以實(shí)現(xiàn)互斥訪(fǎng)問(wèn)。但是你知道,二進(jìn)制信號(hào)量仍然沒(méi)有所有者指針。但有一個(gè)相似之處,即在ISR(interrupt service route)系統(tǒng)中,信號(hào)量或互斥量會(huì)被中斷程序中斷。
多線(xiàn)程編程的時(shí)候,使用無(wú)鎖結(jié)構(gòu)會(huì)不會(huì)比有鎖結(jié)構(gòu)更加快?
這是毫無(wú)疑問(wèn)的,因?yàn)榫€(xiàn)程鎖定是資源密集型的
!那么,如何避免鎖的性能下降呢?
1、從業(yè)務(wù)上避免大量鎖結(jié)構(gòu)
!2. 使用ThreadLocal,可以保證每個(gè)線(xiàn)程中的數(shù)據(jù)不會(huì)互相污染
!3. 如果讀多寫(xiě)少,請(qǐng)使用讀寫(xiě)鎖
!4. 自旋鎖將挑戰(zhàn)CPU,盡管它是一個(gè)線(xiàn)程時(shí)間很少的鎖
!5. 鎖的粒度應(yīng)該盡可能?。嚎梢栽诜椒ㄖ械逆i不應(yīng)該占用整個(gè)方法