线程池c++
1. linux pthread库中对线程的操作
1.1 线程的创建和资源回收
默认创建的线程是joinable的. 1.每一次调用pthread_create()都会创建一个子线程,默认创建的线程是joinable的. 2.子线程则必须显式调用pthread_detach()将其变为non-joinable自行释放资源 3.显式调用pthread_join()由主线程为其释放资源,否则会造成内存泄露.
这里的资源到底是啥?
- 子线程从父线程拷贝的栈内存,使用pthread_join()由父线程清理或pthread_detach()由系统清理,如pthread_create之前父线程中的局部变量
- 子线程自己申请的堆内存,使用清理函数pthread_cleanup_push()和pthread_cleanup_pop(), 如线程内部malloc或new出的空间
pthread_join()阻塞主线程直到子线程返回释放子线程的资源 优点: 主线程阻塞,不占用cpu资源 缺点: 有些业务情境下不希望主线程阻塞,主线程需要做其他的事情 pthread_detach()由子线程自己结束后自行释放资源,主线程使用while (true) 死循环持续运行 优点: 主线程并未阻塞,可以处理其他事情 缺点: 主线程持续占用cpu资源
1.2 线程的互斥和同步
2. 生产者-消费者的多线程模型
/*工作线程运行的函数,它不断从工作队列中取出任务并执行之*/ static void *worker(void *arg);