将线程池技术应用于并行仿真引擎设计?
文章目录
为了充分利用多核的优势,我们利用多线程来进行任务处理,但是线程也同样不能够滥用,它会带来下面的问题:
- 线程本身存在开销,系统必须为每个线程分配如栈、TLS(线程局部存储)、寄存器等;
- 线程管理会给系统带来开销,上下文切换同样会给系统带来成本;
- 线程本身是可重用的资源,不需要每次都进行初始化操作。
所以往往在使用中,我们无需把线程和Task任务
进行一对一的映射,只需要预先初始化有限的线程个数来处理无限的任务即可。相应地,线程池技术应运而生,原理也就是如此。
从图中可看出,线程池中主要含有三个队列:
- 工作队列
- 工作线程队列
- 忙碌线程队列
工作队列是一个阻塞队列,任务(仿函数)不断地被添加进来(自动地阻塞获取的工作线程),工作线程队列(一直不变)则从该队列中获取任务执行(当任务队列为空时阻塞等待通知),如果获取到任务,则将线程送入到忙碌线程队列中,执行任务的仿函数,当任务完成时,重新移出工作线程队列。
上述线程池技术有效地实现了线程、任务的解耦,并且能够有效地管理多个线程,在进行并行仿真引擎设计时,将起到良好的效果。下一步将进行这样的尝试,在线程池技术的基础上,设计出一个良好的并行仿真引擎。