多線程面臨的挑戰(zhàn)

1、多線程的目的是為了讓程序運(yùn)行的更快,但是并不是創(chuàng)建的線程越多越好,因?yàn)槎嗑€程面臨著如下問(wèn)題:

線程上下文切換;

死鎖的問(wèn)題;

受限與硬件和軟件資源的問(wèn)題;

2、線程上下文切換

單核處理器也可以執(zhí)行多線程的任務(wù),因?yàn)閏pu通過(guò)給線程分配時(shí)間碎片來(lái)做到;時(shí)間片是cpu分配給每個(gè)線程的執(zhí)行時(shí)間;該時(shí)間很短,cpu需要不停在的各個(gè)線程間切換,以達(dá)到多線程的目的;cpu通過(guò)循環(huán)算法來(lái)分配時(shí)間碎片,但是在切換前需要保存每個(gè)線程當(dāng)前的執(zhí)行狀態(tài)信息,以便之后在切換回來(lái),但是這樣切換的效率是很低的。

使用vmstat 1命令測(cè)量上下文切換的次數(shù),cs表示上下文切換次數(shù);

3、如何減少上下文切換

(1)無(wú)鎖并發(fā)編程:多線程競(jìng)爭(zhēng)鎖時(shí),會(huì)引起上下文切換,所以多線程處理數(shù)據(jù)時(shí)可以使用避免使用鎖,如按照數(shù)據(jù)id取hash算法取模分段,不同的線程處理不同段的數(shù)據(jù)(Segment),如:把一個(gè)list切分為不同段,分段處理也是一種方法;

(2)CAS算法

? ?使用cas算法來(lái)更新數(shù)據(jù),不需要使用鎖,以此減少鎖帶來(lái)的多線程問(wèn)題。

(3)使用最少線程

? ? 創(chuàng)建合理的線程數(shù),不要任務(wù)很少但是卻創(chuàng)建來(lái)很多的線程。

(4)協(xié)程

? ?在單線程里實(shí)現(xiàn)多任務(wù)的調(diào)度,并在單線程里維持多個(gè)任務(wù)間的切換。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容