请问IOCP和线程池的关系
发布网友
发布时间:2022-06-01 17:57
我来回答
共2个回答
热心网友
时间:2023-10-10 09:59
对于IOCP来说,创建一定数量的工作线程是必要的,但不是必须预先创建。
通常的资料中会提示您创建cpu核心数x2+2数量的工作者线程。
但是请注意:这只是一般情况。
一个线程执行效率是否够高,要看它做了什么和等待了什么。
线程在执行一些阻塞操作的时候是会进行等待的,比如等待硬盘I/O,等待串口数据,等待SQL查询结果……
在工作线程被阻塞并等待时,操作系统会切换context,选择并将执行权力交给另一个“饥饿”线程。
试想一个场景:您的IOCP系统启动时创建了10个工作线程,当某一时刻(比如过年大家都在发短信,而您的系统需要通过串口向短信modem发送和接收数据)大量的需要进行串口数据收发的请求被连入系统,所有10个工作线程全部被排队阻塞在串口短信机收发动作上,这时新的请求就无法及时处理,但您系统的CPU资源其实还有很大富余。只是能够对数据进行处理的工作者线程已经被耗尽。
这个情况该怎么处理呢?
这时您就应当考虑“线程池”的管理模式了。
由线程池管理者判断当前工作线程是否还有空闲的(GetQueuedCompletionStatus时应属于空闲)。如果空闲线程已经不足(这个取决于逻辑,比如当前只有0个或2个空闲线程),那么管理者应立即创建新的工作者线程。如果空闲线程太多(比如有20个空闲的),管理者应将多余的线程关闭(PostQueuedCompletionStatus(MY_MSG_EXIT))。
至于您的疑惑:在用IOCP的时候不就是要预先创建一定数量的线程吗,一旦这些线程全部创建完毕,是不是就等价于已经创建了一个线程池了?
预先创建并且不能够根据实际需要增加和减少的这些工作线程,只能称为线程组,它们并不是线程池。
另外,IOCP也并不是必须在启动时创建一定数量工作线程的,完全可以全部都交给线程池进行判断和管理。启动后当线程池判断空闲工作者不足,则立即进行创建动作。
热心网友
时间:2023-10-10 10:00
windows自带的一套线程池API,貌似就已经集成了IOCP的机制,我的理解就是,直接使用线程池就能一了百了了。