线程池及gdb调试多线程

news2024/12/27 18:43:03

一、线程池概念和使用

概念:通俗的讲就是一个线程的池子,可以循环的完成任务的一组线程集合

必要性:

我们平时创建一个线程,完成某一个任务,等待线程的退出。但当需要创建大量的线程时,假设T1创建线程时间,T2为在线程任务执行时间,T3线程销毁时间当 T1+T3 > T2,这时候就不划算了,使用线程池可以降低频繁创建和销毁线程所带来的开销,任务处理时间比较短的时候这个好处非常显著

线程池的基本结构:

1 任务队列,存储需要处理的任务,由工作线程来处理这些任务

2 线程池工作线程,它是任务队列任务的消费者,等待新任务的信号

线程池的实现:

1.创建线程池的基本结构:

任务队列链表

typedef struct Task;

线程池结构体

typedef struct ThreadPool;

2.线程池的初始化:

pool_init()

{

创建一个线程池结构

实现任务队列互斥锁和条件变量的初始化

创建n个工作线程

}

3.线程池添加任务

   pool_add_task

{

    判断是否有空闲的工作线程

给任务队列添加一个节点

    给工作线程发送信号newtask

}

4.实现工作线程

   workThread

{

while(1){

   等待newtask任务信号

   从任务队列中删除节点

   执行任务

}

}

5.线程池的销毁

   pool_destory

{

删除任务队列链表所有节点,释放空间

删除所有的互斥锁条件变量

删除线程池,释放空间

}

编译错误:

error: ‘ThreadPool {aka struct ThreadPool}’ has no member named ‘head’

意义:ThreadPool 结构体没有head这个成员。

解决:检查是否拼写错误。

error: too few arguments to function ‘pthread_mutex_init’

意思:pthread_mutex_init这个函数参数少了

解决:检查函数的参数,添加对应的参数

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

#define POOL_NUM 10

typedef struct Task{
	void *(*func)(void *arg);
	void *arg;
	struct Task *next;
}Task;

typedef struct ThreadPool{
	pthread_mutex_t taskLock;
	pthread_cond_t newTask;

	pthread_t tid[POOL_NUM];
	Task *queue_head;
	int busywork;

}ThreadPool;

ThreadPool *pool;

void *workThread(void *arg){
	while(1){
		pthread_mutex_lock(&pool->taskLock);
		pthread_cond_wait(&pool->newTask,&pool->taskLock);


		Task *ptask = pool->queue_head;
		pool->queue_head = pool->queue_head->next;

		pthread_mutex_unlock(&pool->taskLock);
		
		ptask->func(ptask->arg);
		pool->busywork--;
	}

}

void *realwork(void *arg){
	printf("Finish work %d\n",(int)arg);

}

void pool_add_task(int arg){
	Task *newTask;

	pthread_mutex_lock(&pool->taskLock);
	while(pool->busywork>=POOL_NUM){
		pthread_mutex_unlock(&pool->taskLock);
		usleep(10000);
		pthread_mutex_lock(&pool->taskLock);
	}
	pthread_mutex_unlock(&pool->taskLock);

	newTask = malloc(sizeof(Task));
	newTask->func = realwork;
	newTask->arg = arg;

	pthread_mutex_lock(&pool->taskLock);
	Task *member = pool->queue_head;
	if(member == NULL){
		pool->queue_head = newTask;
	}else{
		while(member->next != NULL){
			member = member->next;
		}
		member->next = newTask;
	}

	pool->busywork++;
	pthread_cond_signal(&pool->newTask);

	pthread_mutex_unlock(&pool->taskLock);
}

void pool_init(){
	int i=0;
	pool = malloc(sizeof(ThreadPool));
	pthread_mutex_init(&pool->taskLock,NULL);
	pthread_cond_init(&pool->newTask,NULL);
	pool->queue_head = NULL;
	pool->busywork = 0;

	for(i; i < POOL_NUM; i++){
		pthread_create(&pool->tid[i],NULL,workThread,NULL);
	}
}

void pool_destory(){
	Task *head;

	while(pool->queue_head!=NULL){
		head = pool->queue_head;
		pool->queue_head = pool->queue_head->next;
		free(head);
	
	}
	pthread_mutex_destroy(&pool->taskLock);
	pthread_cond_destroy(&pool->newTask);
	free(pool);

}

int main(){
	int j=1;
	pool_init();
	sleep(1);
	for(j;j<=20;j++){
		pool_add_task(j);
	}

	sleep(5);
	pool_destory();

}

二、线程的GDB调试

显示线程:info thread

切换线程:thread id

GDB为特定线程设置断点:break location thread id

GDB设置线程锁:set scheduler-locking on/off

on:其他线程会暂停。可以单独调试一个线程

#include <pthread.h>
#include <stdio.h>

void *testThread(void *arg){
	char *threadName = (char*)arg;
	printf("Current running %s\n",threadName);
	
	printf("aaaaaaaaa\n");
	printf("bbbbbbbbb\n");

	pthread_exit(0);
}


int main(){
	pthread_t tid1,tid2;

	pthread_create(&tid1,NULL,testThread,"thread1");
	pthread_create(&tid2,NULL,testThread,"thread2");

	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/593148.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Breakdance Builder评测 – 快速构建网站?

您是否正在寻找一个WordPress页面构建器&#xff0c;它可以轻松快速地构建网站 – 而不会使网站臃肿&#xff1f;如果是这样&#xff0c;您可能希望继续阅读这篇Breakdance Builder评测。 在构建网站时&#xff0c;速度就是一切。 编辑器在后端加载的速度有多快&#xff1f;您…

Vue + intro.js 实现页面新手引导流程功能

效果图&#xff1a; 1、安装 intro.js npm install intro.js --save 2、在项目的 main.js 中&#xff0c;引入 intro.js 库和相关样式文件&#xff0c;如下&#xff1a; // 首页引导插件 import intro from intro.js // introjs库 import intro.js/introjs.css // introjs默…

民宿小程序源码,开启民宿新模式

今天我为大家带来了一份最新的民宿小程序源码&#xff01;这个源码不仅可以帮助你开启民宿新模式&#xff0c;还可以让你轻松实现线上预订、在线客服等多种功能。 民宿小程序源码&#xff0c;是什么&#xff1f; 民宿小程序源码是一款基于微信小程序平台的民宿管理系统&#…

数据库基础概念

文章目录 一、什么是数据库二、数据库的分类三、数据库的使用&#xff08;内部&#xff09; 一、什么是数据库 数据库是一类软件&#xff0c;作用是管理数据&#xff0c;内部应用了许多数据结构。但是我们还可以用文档储存数据&#xff0c;为什么要出现数据库&#xff1f; 文…

2022年天府杯全国大学生数学建模竞赛B题第一“君”情解题全过程文档及程序

2022年天府杯全国大学生数学建模竞赛 B题 第一“君”情 原题再现&#xff1a; 近日俄罗斯和乌克兰的冲突日益加剧&#xff0c;不难发现现代战争仍然是以人为主的战争&#xff0c;并未进入到全机械化的战争状态。那么在战争中军事物资的补给显得十分重要&#xff0c;中国古代兵…

Opencv(图像处理)-基于Python-图像的基本运算-给图片加水印

1. 图像运算概念2. 图像运算2.1 add()2.2 substract()部分代码示例&#xff1a; 2.3 multiply()/divide()2.4 addWeighted()部分代码展示 2.5 与/或/非bitwise_and()bitwise_or()bitwise_not()bitwise_xor部分代码展示 3.给一幅图像添加水印 1. 图像运算概念 在计算机的世界里…

git工作流实践

常见分支命名 远程仓库的分支&#xff1a;主干分支master, 开发分支dev&#xff0c;发布分支release 个人开发分支&#xff1a;特性分支feature, 缺陷修改分支bugfix&#xff0c; 热更新分支 hotfix 一般工作流如下 创建个人本地开发分支&#xff1a; git checkout -b feat…

Benewake(北醒) 快速实现TFmini-i-RS485与电脑通信操作说明

目录 一、前言二、工具准备1. USB-RS485 转接器2. TFmini-i-RS4853. 兆信直流电源4.连接线、绝缘胶带、螺丝刀5. PC&#xff1a;Windows 系统6. 串口助手软件 三、连接方式1. USB-RS485 转接板接口说明2. TFmini-i-RS485 引脚定义3. 连接图 四、TFmini-i-RS485 与电脑通信操作说…

cisp pte模拟题

1.信息搜集 本题共三个key 端口 1433 27689 存活ip 192.168.85.137 2.访问网站27689进行信息搜集 一个登录框&#xff0c;sql注入失败&#xff0c;暴力破解失败 扫描目录 发现三个文件robots.txt ,web.config 除了robots.txt,其他都访问不了 访问robots.txt,发现一个file参数…

ChatGPT实际上是如何工作的?

ChatGPT是如何工作的&#xff1f; 我们深入研究了广受欢迎的AI聊天机器人ChatGPT的内部运作方式。如果您想了解它是如何进行生成式人工智能魔术的&#xff0c;请继续阅读。 谷歌、Wolfram Alpha和ChatGPT都通过一个单行文本输入框与用户进行交互&#xff0c;并提供文本结果。谷…

Ubuntu18.04下搭建Ardupliot开发环境

本文参考的文章: -Ardupilot开发环境搭建&#xff08;Ubuntu18.04&#xff0c;20190407&#xff09; -Ardupilot环境搭建 1、下载文件 1.在GitHub上下载ardupilot文件&#xff0c;网速很慢的时候科学上网。 git clone https://github.com/ArduPilot/ardupilotcd ardupilotgit…

音乐推荐系统实战

文章目录 1. 项目背景2. 数据处理2.1 统计用户播放总量2.2 统计歌曲播放总量2.3 过滤出实验数据2.4 加入音乐详情信息2.5 查看音乐集情况2.6 查看用户播放量的分布 3. 推荐系统3.1 排行榜单排序3.2 基于歌曲相似度的推荐&#xff08;协同过滤&#xff09;3.3 基于矩阵分解&…

市面上流行的 5 大网页制作工具总结

这里是对市面上流行的 5 大网页制作工具的总结&#xff1a; 1. 即时设计 即时设计是一款国内新一代在线协作设计工具&#xff0c;具备原型、设计、交付、协作和资源管理等功能&#xff0c;适合个人用户和团队使用。它提供丰富的社区设计资源和原型模板&#xff0c;支持 UI/UX…

Python 的十大特性

摘要 在了解 Python 的特性之前&#xff0c;我们首先要了解 Python 编程语言是什么。Python 编程语言是世界上发展最快的编程语言。这一高级通用编程语言提供了广泛的实际应用&#xff0c;并且是一种非常流行的认证。 Python 可以让程序员更加高效地工作和集成系统。Python 的…

vue中如何通过iframe方式加载本地的vue页面

这个需求一般很少能遇到&#xff0c;只要说去了iframe&#xff0c;很多人就会唾弃。 但是有时候的确无法避免使用它&#xff0c;当iframe的特性带来的优势远远高于自己用div模拟的时候 啥时候需要用到iframe加载本地的vue文件呢 我在写一个demo&#xff0c;我需要demo效果模拟…

【接口测试】神器JMeter

‍1 JMeter是什么 Apache JMeter是Apache组织开发的一款开源软件&#xff0c;是一款非常好用的接口测试工具。它的特点是开源免费&#xff0c;简单好用。 我们在测试过程需要做接口测试的话就可以使用它&#xff0c;也可以用来批量造数据&#xff0c;接下来我们就来看看JMete…

Django框架之验证码简单实现

是一种方式防止csrf的策略。在用户注册、登录页面的时候使用&#xff1b;为了防止暴力请求&#xff0c;减轻服务器压力。 目录 安装pillow库 验证码显示 引入类库 视图方法 创建路由 创建表单 模板内容 模板路由 模板视图 视图验证 路由 引入 验证视图 效果 成功…

从7K到20K,在测试行业摸爬滚打的这5年,想个2023年还没找到工作的提个醒~

我是一名转IT测试人&#xff0c;我的专业是化学&#xff0c;去化工厂实习才发现这专业的坑人之处&#xff0c;化学试剂害人不浅&#xff0c;有毒&#xff0c;易燃易爆&#xff0c;实验室经常用丙酮&#xff0c;甲醇&#xff0c;四氯化碳&#xff0c;接触多了&#xff0c;吃个饭…

JMeter 接口测试教程,详解 HTTP Request 取样器和 fiddler 调试技巧!

目录 前言&#xff1a; 一、HTTP Request取样器介绍 二、使用HTTP Request取样器进行接口调试 1. 创建测试计划&#xff08;Test Plan&#xff09;和线程组&#xff08;Thread Group&#xff09; 2. 配置HTTP Request取样器参数 3. 添加断言 4. 运行接口测试 三、结合f…

Linux 企业级安全原理和防范技巧

Linux 企业级安全原理和防范技巧 1. 企业级Linux系统防护概述1.1 企业级Linux系统安全威胁1.2 企业级Linux系统安全立体式防范体系1.2.1 Linux文件系统访问安全1.2.2 Linux进程安全1. 进程的种类2. 进程管理方法 1.2.3 Linux用户管理安全1. 管理用户及组文件安全2. 用户密码管理…