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