周末了,美美的睡個(gè)懶覺起來做早飯,做飯其實(shí)很簡(jiǎn)單,照著菜譜一步步來就行,沒什么難度。
在你做飯時(shí)突然手機(jī)鈴聲大作,原來是線上出現(xiàn)了故障,其它同事正在排查,需要你協(xié)助一下,一邊做飯一邊打電話應(yīng)該也不算太難,你可以的。
正當(dāng)你一邊排查問題一邊做飯時(shí)本來約好明天來維修空調(diào)的師傅因?yàn)閰f(xié)調(diào)不開提前一天來了,你不得不一邊做飯一邊排查問題一邊告訴維修師傅哪個(gè)空調(diào)壞了、問題是啥。。怎么樣,是不是開始應(yīng)付不過來了?
這還不算啥,就在這時(shí)你約好的同學(xué)也到了,一邊接待同學(xué)一邊指揮著維修師傅一邊排查問題一邊做早飯,你是不是已經(jīng)開始瘋了。
當(dāng)多線程遇到共享
看到了吧,"多線程"絕不是在編程這個(gè)層面很難, 多線程本身就很難 。
尤其是當(dāng)多線程遇上共享數(shù)據(jù)時(shí)更是難上加難,對(duì)人類來說,同時(shí)做兩件互不干擾的事情還是有可能的,一邊寫代碼一邊聽歌就是,但你可以試試讓兩個(gè)任務(wù)共享聽的能力,同時(shí)聽兩首歌;或者讓兩個(gè)任務(wù)共享大腦的思考能力,一邊解bug一邊刷算法,你還能輕松加愉快嗎?
如果你試圖推演多線程訪問共享數(shù)據(jù)那么你的腦海很可能就像剛才提到的“一邊接待同學(xué)一邊指揮這維修師傅一邊排查問題一邊做早飯”,一團(tuán)糟。。人類的大腦似乎天生就不是很擅長(zhǎng)(天才不在此討論范圍),更不用說因解決共享數(shù)據(jù)而帶來的死鎖等問題。
遇事不決量子力學(xué)
你的多線程代碼可能在99.99%的情況下工作正常,但在小概率下就是會(huì)有問題,這都不算啥,問題是你該怎么debug呢?
你該怎么調(diào)試一個(gè)可能只有萬分之一出錯(cuò)的程序呢?而且更棒的是,就像測(cè)不準(zhǔn)原理一樣,測(cè)量這操作本身竟然不可避免的攪擾了被測(cè)量粒子的運(yùn)動(dòng)狀態(tài),因此產(chǎn)生不確定性。
當(dāng)你試圖用調(diào)試器attach上去又或者加一些log時(shí)這本身也會(huì)改變多線程程序的行為,或者問題就此不再產(chǎn)生,又或者概率變?yōu)榱耸f分之一,從這個(gè)角度看多線程和量子力學(xué)有異曲同工之妙
這里的根源在于“ 可能性的組合爆炸 ”問題。
由于操作系統(tǒng)的調(diào)度、系統(tǒng)中斷再加上程序員添加的鎖等原因,我們的程序(線程)總是走走停停,這就導(dǎo)致在程序的“執(zhí)行空間”上有太多可能,試圖去測(cè)試每一種可能幾乎是不可能的事情,而我們添加一些log等本身就給本來已經(jīng)爆炸的組合新增一個(gè)維度,導(dǎo)致有的問題非常難復(fù)現(xiàn)。
盡管我們的調(diào)試工具IDE等越來越高級(jí),但依然解決不了多線程本身的問題。
性能是個(gè)問題
如果你不關(guān)心程序性能的話,大可以加上一個(gè)很豪邁的鎖,但鎖也不應(yīng)該加的過分放飛自我,你能想象為了讓北京的某個(gè)同學(xué)買一本書電商要把整個(gè)華北地區(qū)的庫(kù)存鎖住嗎?
如果你關(guān)心性能的話那么鎖的粒度會(huì)是個(gè)問題,同時(shí)在硬件級(jí)別你可能需要了解多核cache一致性以及memory ordering等,這些都不是那么容易理解,更不用提無鎖編程,lock-free等等。
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
6754瀏覽量
88611 -
多線程編程
+關(guān)注
關(guān)注
0文章
16瀏覽量
6679
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論