linux学习6线程池

本文探讨了在Linux环境下,当面临大量线程请求时使用线程池的必要性,详细介绍了线程池如何避免内存耗尽和减少线程创建销毁的开销。线程池在日志文件处理中的应用也被提及,以优化磁盘操作。此外,还简要讨论了gdb调试在理解线程池工作原理中的作用,并展示了线程池的代码实现与执行流程。
摘要由CSDN通过智能技术生成

线程池使用场景

在这里插入图片描述

当所请求的线程数额庞大的时候,需要使用到线程池
一个线程posix的大小为8M左右
1G内存能有128个线程
16G内存能有2048个线程

线程池的作用:

  1. 避免线程太多,使得内存耗尽
  2. 避免创建与销毁线程的代价
  3. 任务与执行分离

线程池还可以应用在日志文件方面。(磁盘操作远远比内存操作慢很多,写线程的时候,会引起线程的挂起)
写日志的任务—>执行任务的时候

一种使用线程池的场景:
在这里插入图片描述
营业厅里面的公示牌:防止多个办业务的人,在一个柜员里面办业务。两个柜员同时为一个人办业务服务。使得营业厅能够正常有序的工作。

重要的三个方面:

  1. 任务队列
  2. 执行队列
  3. 管理组件 —>锁

浅谈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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值