线程池使用场景
当所请求的线程数额庞大的时候,需要使用到线程池
一个线程posix的大小为8M左右
1G内存能有128个线程
16G内存能有2048个线程
线程池的作用:
- 避免线程太多,使得内存耗尽
- 避免创建与销毁线程的代价
- 任务与执行分离
线程池还可以应用在日志文件方面。(磁盘操作远远比内存操作慢很多,写线程的时候,会引起线程的挂起)
写日志的任务—>执行任务的时候
一种使用线程池的场景:
营业厅里面的公示牌:防止多个办业务的人,在一个柜员里面办业务。两个柜员同时为一个人办业务服务。使得营业厅能够正常有序的工作。
重要的三个方面:
- 任务队列
- 执行队列
- 管理组件 —>锁
浅谈gdb调试
gcc -o threadpool threadpool.c -lpthread -g //编译的时候加上-g采用gdb调试
gdb ./threadpool
b 64 //一般在判断语句打断点,在第64行打断点
b 74 //在可能空指针的地方打断点
r //开始运行
c //继续执行
q //退出gdb
线程池代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
//宏定义,链表的插入操作
#define LIST_INSERT(item, list) do {
\
item->prev = NULL; \
item->next = list; \
if ((list) != NULL) (list)->prev = item; \
(list) = item; \
} while(0)
//宏定义,链表的移除操作
#define LIST_REMOVE(item, list) do {
\
if (item->prev != NULL) item->prev->next = item->next; \
if (item->next != NULL) item->next->prev = item->prev; \
if (list == item) list = item->next; \
item->prev = item->next = NULL; \
} while