互斥鎖mutex:一個(gè)線程獲得資源,其他線程睡眠。
自旋鎖spinlock:自旋鎖是一種特殊的互斥鎖,當(dāng)資源被枷鎖后,其他線程想要再次加鎖,此時(shí)該線程不會(huì)被阻塞睡眠而是陷入循環(huán)等待狀態(tài)(不能在做其它事情)。
這樣節(jié)省了線程從睡眠狀態(tài)到被喚醒期間的消耗,在加鎖時(shí)間短暫的環(huán)境下會(huì)極大的提高效率。但如果加鎖時(shí)間過(guò)長(zhǎng),則會(huì)非常浪費(fèi)CPU資源
遞歸鎖:一個(gè)線程可以多次獲得該資源鎖,其他線程得等多次鎖用完后才能獲得資源。
讀寫鎖rwlock:它擁有讀狀態(tài)加鎖、寫狀態(tài)加鎖。一個(gè)線程可以占有寫狀態(tài)的鎖,但可以有多個(gè)線程同時(shí)占有讀狀態(tài)鎖,這也是它可以實(shí)現(xiàn)高并發(fā)的原因。
RCU:即read-copy-update,在修改數(shù)據(jù)時(shí),首先需要讀取數(shù)據(jù),然后生成一個(gè)副本,對(duì)副本進(jìn)行修改。修改完成后,再將老數(shù)據(jù)update成新的數(shù)據(jù)。使用RCU時(shí),讀者幾乎不需要同步開銷,既不需要獲得鎖,也不使用原子指令,不會(huì)導(dǎo)致鎖競(jìng)爭(zhēng),因此就不用考慮死鎖問(wèn)題了。而對(duì)于寫者的同步開銷較大,它需要復(fù)制被修改的數(shù)據(jù),還必須使用鎖機(jī)制同步并行其它寫者的修改操作。在有大量讀操作,少量寫操作的情況下效率非常高
信號(hào)量:semaphore,是用于線程間同步的,當(dāng)一個(gè)線程完成操作后就通過(guò)信號(hào)量通知其它線程,然后別的線程就可以繼續(xù)進(jìn)行某些操作了。
信號(hào)量和互斥鎖的區(qū)別:semaphore
信號(hào)量是用于線程間同步的,而互斥鎖是用于線程的互斥的
互斥量的獲取和釋放都是在同一線程中完成的,pthread_mutex_lock(),pthread_mutex_unlock()。而信號(hào)量的獲得和釋放是在不同的線程的操作為sem_wait(),sempost();
互斥量的值只能為0和1,而信號(hào)量只要value>0,其它線程就可以sem_wait成功,成功后信號(hào)量value減一。若value值不大于0,則sem_wait阻塞,直到sem_post釋放后value加1。因此信號(hào)量的值可以為非負(fù)整數(shù)
本文來(lái)自 禾夕 的CSDN 博客 ,全文地址請(qǐng)點(diǎn)擊:https://blog.csdn.net/u012658346/article/details/51188116?utm_source=copy
https://blog.csdn.net/u012658346/article/details/51188116/