线程池并发服务器
什么是線程池?
線程池是一個抽象概念,可以簡單的認(rèn)為若干線程在一起運(yùn)行,線程不退出,等待有任務(wù)處理。為什么要有線程池?
(1)以網(wǎng)絡(luò)編程服務(wù)器端為例,作為服務(wù)器端支持高并發(fā),可以有多個客戶端連接,發(fā)出請求,對于多個請求我們每次都去建立線程,這樣線程會創(chuàng)建很多,而且線程執(zhí)行完銷毀也會有很大的系統(tǒng)開銷,使用上效率很低。
(2)之前文章的線程例子中,我們也知道創(chuàng)建線程并非多多益善,所以我們的思路是提前創(chuàng)建好若干個線程,不退出,等待任務(wù)的產(chǎn)生,去接收任務(wù)處理后等待下一個任務(wù)。
線程池如何實(shí)現(xiàn)?
需要思考2個問題。
(1)假設(shè)線程池創(chuàng)建了,線程們?nèi)绾稳f(xié)調(diào)接收任務(wù)并且處理?
(2)線程池上的線程如何能夠執(zhí)行不同的請求任務(wù)?
上述問題1就很像我們之前文章提過的生產(chǎn)者和消費(fèi)者模型,客戶端對應(yīng)生產(chǎn)者,服務(wù)器端這邊的線程池對應(yīng)消費(fèi)者,需要借助互斥鎖和條件變量來搞定。
問題2解決思路就是利用回調(diào)機(jī)制,我們同樣可以借助結(jié)構(gòu)體的方式,對任務(wù)進(jìn)行封裝,比如任務(wù)的數(shù)據(jù)和任務(wù)處理回調(diào)都封裝在結(jié)構(gòu)體上,這樣線程池的工作線程拿到任務(wù)的同時,也知道該如何執(zhí)行了。
總結(jié)