本线程池的作用是管理阻塞的网络操作函数的调用...每次网络操作调用都加入到线程池当中,然后线程回调函数执行 取任务的操作并执行这次任务。
线程池的设计
将线程池的所有操作都封装在类中...外界使用的话只需要new 一个这个线程池对象。
1.加任务函数
2.取任务函数
3.初始化线程池
4.销毁线程池
线程池的实现
实现跨平台线程池需要了解平台相关的线程库,linux一般采用posix标准的线程库(大部分使用于ios,android),windows则采用windows.h 下的线程相关函数.
1.信号量
为了控制线程访问,可以采用信号量来协调线程的访问线程竞争资源的顺序。
linux 采用 sem_t ,sem_init,sem_wait,sem_post来实现
windows采用WaitForSingleObject,ReleaseSemaphore来实现
2.互斥锁
linux 采用pthread_mutex_t,pthread_mutex_lock,pthread_mutex_unlock
windows采用CRITICAL_SECTION,InitializeCriticalSection,EnterCriticalSection,LeaveCriticalSection
3.对于线程池的任务其回调函数是一直在执行操作直到线程被关闭,或者程序终止,进程终止
4.资源的访问控制
(1)对于信号量初始值应该将可用资源设置为0
(2)当用户向线程池中加入task时,信号量加1,表示可用资源加1.
(3)线程回调函数提取任务,若任务>0则提取任务并执行,若<=0则wait
5.线程池销毁,可以在主线程中调用线程池释放资源函数并强制关闭线程池。如果线程池的生命周期是整个进程或者程序的生命周期,可以利用系统回收。
线程池的工作流程:
首先需要明确的是线程池中的竞争资源...生产资源,消费资源...在线程池中 这两者分别是,任务进队列,线程执行队列中的任务,这里就设置两个资源标识,A代表生产任务线程,B代表执行任务线程。 采用信号量来同步多个线程(linux 和windows 与 移动平台 线程同步方式不同,移动平台不能直接使用sem_t ,平台不支持)生产资源时需要等待 可用的线程来生产资源, 资源队列需要加锁,消费资源时需要等待生产任务线程。