最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

一篇教你解決如何在不加鎖的情況下解決多線程問題!

2023-03-06 15:23 作者:補(bǔ)給站Linux內(nèi)核  | 我要投稿

怎樣在不加鎖的情況下解決線程安全問題,你需要了解lock free和wait free這兩個(gè)概念,在此之前我們先從最簡單的有鎖編程開始。我們知道,多線程同時(shí)修改共享變量時(shí)會出現(xiàn)數(shù)據(jù)不一致的問題,比如多個(gè)線程同時(shí)對一個(gè)變量加1,假設(shè)count的初始值為0:

如果只有一個(gè)線程調(diào)用add函數(shù),那么什么問題都沒有,但如果多個(gè)線程同時(shí)調(diào)用上述函數(shù),比如10個(gè)線程都調(diào)用一遍,那么count值最后不一定等于0,原因在于對count加1的操作不是原子的。所謂某個(gè)操作是原子的是指CPU要么執(zhí)行該操作,要么不執(zhí)行該操作,不存在中間狀態(tài),但上述對count加1的操作經(jīng)過編譯器處理后會生成幾條對應(yīng)的機(jī)器指令,所以該操作不是原子的。那么怎樣才能讓其變成原子的呢?很簡單,加一把鎖。

現(xiàn)在我們用一把鎖將對count的操作保護(hù)了起來,此時(shí)你可以將mtx.lock()以及mtx.unlock()中間的代碼看成原子的,CPU要完全執(zhí)行完對count的加1要么根本不會操作count,這樣上述程序的運(yùn)行結(jié)果就是我們想要的了。這是怎樣做到呢?這就要說到操作系統(tǒng)了,千萬不要小瞧了上面的mutex這把鎖,這把鎖的背后相當(dāng)復(fù)雜,因?yàn)檫@涉及到了操作系統(tǒng)。假設(shè)現(xiàn)在有三個(gè)線程,各自運(yùn)行在不同的CPU核心上,每個(gè)方框代表一個(gè)時(shí)間片:

T1時(shí)間片這三個(gè)線程都在調(diào)用add函數(shù),線程A拿到鎖,A可以繼續(xù)向前推進(jìn),但B和C就沒這么幸運(yùn)了,此時(shí)操作系統(tǒng)將剝奪線程B和C繼續(xù)持有CPU的權(quán)利,將其分配給其它具備執(zhí)行條件的線程,這就是操作系統(tǒng)中所謂的掛起,注意,這個(gè)過程相當(dāng)復(fù)雜,因?yàn)檫@涉及到用戶態(tài)與內(nèi)核態(tài)的切換以及線程的切換等等。此時(shí)來到T2時(shí)間片,線程A繼續(xù)向前推進(jìn),線程B和C則被按下暫停鍵。T3時(shí)間片,然而就在線程A拿到鎖運(yùn)行時(shí)因?yàn)槟承┰蛳窀邇?yōu)先級線程槍占之類導(dǎo)致操作系統(tǒng)也剝奪了線程A繼續(xù)持有CPU的權(quán)利,糟糕的是,因?yàn)榫€程A此時(shí)持有鎖,而線程A又無法繼續(xù)向前推進(jìn),這就進(jìn)一步使得線程B和C也無法繼續(xù)向前推進(jìn)。你會發(fā)現(xiàn)在T3時(shí)刻,這幾個(gè)線程都沒有任何進(jìn)展,根本原因在于我們?yōu)榻鉀Q多線程問題加互斥鎖驚動了操作系統(tǒng),而這類互斥鎖是操作系統(tǒng)給我們實(shí)現(xiàn)的,那么解決線程安全問題一定要經(jīng)過操作系統(tǒng)嗎?不是的,在硬件層面也可以解決線程安全問題,硬件層面當(dāng)然是指CPU,或者說機(jī)器指令。CPU中有特定的原子指令,實(shí)際上操作系統(tǒng)也是基于這些指令實(shí)現(xiàn)的互斥鎖,既然操作系統(tǒng)能用這些指令,我們(用戶態(tài))也可以使用這些指令,基于此我們可以將上述代碼進(jìn)行簡單改造:

此時(shí)add函數(shù)是線程安全的,我們也沒有對其進(jìn)行加鎖,不管多少線程同時(shí)調(diào)用add函數(shù)得到count都是正確的,而該函數(shù)的執(zhí)行完全不涉及操作系統(tǒng),不需要操作系統(tǒng)來維護(hù)秩序,利用的就是CPU中的原子指令,CPU在硬件層面一樣可以替我們維護(hù)秩序。上述代碼就是所謂lock-free的,不管操作系統(tǒng)怎樣調(diào)度這三個(gè)線程,我們都能確保這三個(gè)線程中總有一個(gè)能繼續(xù)向前推進(jìn)。


【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【749907784】整理了一些個(gè)人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實(shí)戰(zhàn)項(xiàng)目及代碼)? ??

lock-free的系統(tǒng)看起來像這樣:

對于這類系統(tǒng)不存在某個(gè)時(shí)間片下線程都無法推進(jìn)的情況,換句話說就是lock-free程序保證至少有一個(gè)線程能繼續(xù)向前推進(jìn)??梢钥吹?,lock-free給出了比普通鎖更優(yōu)的保障。但不能簡單從代碼是不是加鎖或不加鎖去判斷代碼是否lock-free,回旋鎖也是沒有上述互斥鎖的,也不經(jīng)過操作系統(tǒng),但回旋鎖并不是lock-free的,如果你這樣利用CPU中的原子操作修改add函數(shù):

這就是典型的回旋鎖,然而如果某個(gè)線程持有回旋鎖后被操作系統(tǒng)掛起那么其它線程開始無效的執(zhí)行死循環(huán),除了白白消耗CPU之外它們都無法繼續(xù)向前推進(jìn),顯而易見,如果此時(shí)系統(tǒng)負(fù)載較高那么此類程序的性能會變差。既然現(xiàn)在你已經(jīng)知道了lock-free我們再繼續(xù)優(yōu)化這段代碼:

這段代碼沒有鎖,也不需要用循環(huán)不斷檢測是否有其它線程修改count,不管操作系統(tǒng)如何調(diào)度這三個(gè)線程,它們都能在有限的操作數(shù)內(nèi)執(zhí)行完成,此時(shí)我們說該程序是wati-free的,wait-free系統(tǒng)運(yùn)行起來像這樣:

可以看到在任意時(shí)間片內(nèi),不管操作系統(tǒng)怎樣調(diào)度,所有線程都能向前推進(jìn)。wait-free比lock-free的要求更高更加嚴(yán)格,由于wait-free的程序總是能在有限的步驟內(nèi)執(zhí)行完成,因此實(shí)時(shí)性是最好的,適用于那些對實(shí)時(shí)性要求較高的場景,當(dāng)然實(shí)現(xiàn)難度也要比lock-free更高。值得注意的是,wait-free以及l(fā)ock-free程序的實(shí)現(xiàn)通常不是那么簡單。


原文作者:碼農(nóng)的荒島求生



一篇教你解決如何在不加鎖的情況下解決多線程問題!的評論 (共 條)

分享到微博請遵守國家法律
洪泽县| 富平县| 昌江| 盐亭县| 灌南县| 新和县| 鄄城县| 贺兰县| 青田县| 龙口市| 古田县| 桐城市| 吴旗县| 巴彦县| 绥德县| 忻城县| 福海县| 哈尔滨市| 绥宁县| 呼玛县| 舞阳县| 上思县| 青海省| 阿拉善左旗| 颍上县| 余干县| 社旗县| 安宁市| 安多县| 萨嘎县| 思南县| 甘洛县| 蒲江县| 曲麻莱县| 乌鲁木齐县| 壶关县| 孟连| 兴国县| 英吉沙县| 甘肃省| 安化县|