日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

IOCP线程池的开发-(1)

發(fā)布時間:2025/3/17 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IOCP线程池的开发-(1) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
在以前的文章中,我已經(jīng)描述了使用IOCP來編寫一個可以支持大量數(shù)據(jù)連接的網(wǎng)絡(luò)通信部分的內(nèi)容。但是IOCP的作用僅限于用來編寫網(wǎng)絡(luò)通信嗎?答案是否定的。在《windows核心編程》一書中,作者也說明了使用IO完成端口允許我們向一個設(shè)備同時發(fā)送多個IO請求,它允許一個線程發(fā)出IO請求,另一個線程對結(jié)果進(jìn)行處理,這項(xiàng)技術(shù)具有高度的伸縮性和最佳的靈活性windows核心編程第297頁)。這就說明了IOCP不只是用來開發(fā)網(wǎng)絡(luò)代碼,只要是IO的投遞處理都可以用IOCP來處理。這樣的話我們就可以使用IOCP來開發(fā)我們的線程池了。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

?

為什么非要用IOCP來開發(fā)線程池呢?讓我們來分析一下線程池的作用,以及IOCP來開發(fā)線程池的好處。

?

當(dāng)我們做服務(wù)端開發(fā)的時候,經(jīng)常需要對一些慢設(shè)備進(jìn)行操作(例如數(shù)據(jù)庫,文件等等)。當(dāng)我們只使用一個線程來處理慢設(shè)備的時候,會發(fā)現(xiàn)我們的程序運(yùn)行起來CPU利用率過低,處理速度過慢。如果我們使用多線程同時來操作,就可以大大提高效率。但是我們自己寫多線程調(diào)度的時候卻存在2個難以處理的問題:

1:我們需要開多少個線程合適?因?yàn)槲覀冎肋^多的線程在CPU調(diào)度切換的時候會有相當(dāng)大的消耗,從而造成效率的低下(一些初學(xué)者理解的線程越多速度越快的觀點(diǎn)是錯誤的)。

2:我們?nèi)绾握{(diào)度線程?當(dāng)我們操作多線程的時候我們?nèi)绾芜x取合適的線程來處理呢?如果只用一個指定的線程那自然不行(這樣的話和單線程沒有任何區(qū)別了)。那我們又如何選擇合適的線程呢?我想大家一定可以實(shí)現(xiàn),但是實(shí)現(xiàn)的結(jié)果就是需要進(jìn)行大量的判斷,然后來選擇合適的線程處理。這樣本身增加了編碼復(fù)雜度,而且降低了效率。(大道至簡,這句話用在開發(fā)上簡直是太精辟了)。

?

而這兩個問題,IOCP卻恰恰已經(jīng)為我們解決了。

1IOCP在一臺機(jī)器上開的線程數(shù)量是有一定規(guī)定的。一般來說是CPU數(shù)量的*2 + 2。(有的書上說是*2)。

2:對于線程的調(diào)度,IOCP采用了后進(jìn)先出的原則。例如當(dāng)有ABCD 4個等待線程隊(duì)列,那么當(dāng)數(shù)據(jù)投遞過來以后IOCP會選擇最后一次調(diào)用GetQueuedCompletionStatus的線程去處理這個數(shù)據(jù)。例如最后調(diào)用GetQueuedCompletionStatus的線程為A,那么線程A會被喚醒。同理當(dāng)線程A正在處于繁忙狀態(tài)時,則剩余的等待線程隊(duì)列中的最后一個調(diào)用GetQueuedCompletionStatus函數(shù)的線程會被喚醒,去進(jìn)行處理。

?

通過以上兩點(diǎn)來看,使用IOCP來編寫線程池對于開發(fā)服務(wù)端程序是非常有好處的。

?

那么我們怎樣用IOCP來編寫線程池呢?

首先我們來分析一下IOCP在網(wǎng)絡(luò)通信過程中是如何實(shí)現(xiàn)的,這有助于我們用IOCP來編寫線程池。

?

在網(wǎng)絡(luò)通信中,當(dāng)我們使用IOCP來接收數(shù)據(jù)的時候,我們首先需要投遞一個WSARecv函數(shù),用來通知系統(tǒng)我們已經(jīng)投遞了接收請求,當(dāng)系統(tǒng)接收到數(shù)據(jù)以后,會自動填充重疊結(jié)構(gòu),并從函數(shù)GetQueuedCompletionStatus返回這個重疊結(jié)構(gòu)和數(shù)據(jù)的長度。而且我們也可以使用函數(shù)

PostQueuedCompletionStatus來投遞我們自己定義的消息。這一點(diǎn)在IOCP編寫線程池的時候尤為重要。

?

下一篇將將如何實(shí)現(xiàn)IOCP線程池。

總結(jié)

以上是生活随笔為你收集整理的IOCP线程池的开发-(1)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。