文章目录
多线程和线程池的c++实现
1. linux pthread库中对线程的操作
1.1 线程的创建和资源回收
每一次调用pthread_create()都会创建一个子线程,如果子线程是joinable,则
必须显式调用pthread_detach()将其变为non-joinable自行释放资源
or 显式调用pthread_join()由主线程为其释放资源,否则会造成内存泄露.
默认创建的线程是joinable的.
这里的资源到底是啥?
- 子线程从父线程拷贝的栈内存,使用pthread_join()由父线程清理或
pthread_detach()由系统清理,如pthread_create之前父线程中的局部变量 - 子线程自己申请的堆内存,使用清理函数pthread_cleanup_push()
和pthread_cleanup_pop(), 如线程内部malloc或new出的空间
参见https://www.cnblogs.com/cthon/p/9078042.html, TODO
线程执行的函数其中的参数,返回值,局部变量在线程执行完毕离开函数后均会自动
释放,不在这里所说的资源范围内
如果主线程想要使用子线程的结果,则不能自顾自的直接返回,由2种可选方式:
- pthread_join()阻塞主线程直到子线程返回释放子线程的资源
优点: 主线程阻塞,不占用cpu资源
缺点: 有些业务情境下不希望主线程阻塞,主线程需要做其他的事情 - pthread_detach()由子线程自己结束后自行释放资源,主线程使用while (true)
死循环持续运行
优点: 主线程并未阻塞,可以处理其他事情