线程池及gdb调试多线程

这篇具有很好参考价值的文章主要介绍了线程池及gdb调试多线程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、线程池概念和使用

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

必要性:

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

线程池的基本结构:

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

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

线程池及gdb调试多线程

线程池的实现:

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:其他线程会暂停。可以单独调试一个线程文章来源地址https://www.toymoban.com/news/detail-466357.html

#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);

}

到了这里,关于线程池及gdb调试多线程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 调试工具_gdb使用教程

    目录 一. 环境介绍 二. gdb指令 1. 启动调试 2. 退出调试 3. 查看代码  4. 运行程序  5. 打断点 6. 查看断点 7.  删除断点 8.  逐过程调试 9. 逐语句调试 10.  查看变量 11. 常显示变量(监视) 12. 取消常显示变量 13. 运行到指定行 14. 执行完当前函数的剩余部分 15. 执行到下一个断点

    2024年02月15日
    浏览(61)
  • arm环境使用GDB调试

            调试设备代码的时候,经常碰到程序异常或者功能对不上,以前这种时候就是加打印消息,然后重新编译把程序放进去跑,通过打印消息来判断代码出问题的点在哪里,但是有的时候可能需要反复加多次才能定位到问题点,而使用gdb调试就可以很快找到问题,非常

    2024年01月25日
    浏览(41)
  • 程序调试利器——GDB使用指南

    GDB是GNU Debugger的简称,其作用是可以在程序运行时,检测程序正在做些什么。GDB程序自身是使用C和C++程序编写的,但可以支持除C和C++之外很多编程语言的调试。GDB原生支持调试的语言包含: •C •C++ •D •Go •Object-C •OpenCL C •Fortran •Pascal •Rust •Modula-2 •Ada 此外,通过

    2024年02月04日
    浏览(48)
  • 【gdb调试】在ubuntu环境使用gdb调试一棵四层二叉树的数据结构详解

    目录 🌞1. 整体思路 🌞2. 准备内容 🌼2.1 配置.c文件 🌼2.2 准备测试程序 🌼2.3 GDB调试基础 🌞3. GDB调试四层二叉树 🌼3.1 测试程序分析 🌼3.2 gdb分析 🌻1. 设置断点 🌻2. 启动程序并执行到断点处 🌻3. 打印变量的值 🌻4. 单步执行 s 进入buildTree函数内部 a. 第一层:根节点赋

    2024年04月17日
    浏览(28)
  • 【Linux】gdb调试器的使用

    文章目录 一、gdb简介 二、调试前的准备 1、生成调试文件 2、启动 gdb  三、gdb 使用方法  1、查看源代码 2、设置 / 查看断点(多种方式设置断点) 方法一 方法二 方法三 3、run  4、删除断点、断点无效 5、逐过程调试(以函数为单位) 6、逐语句调试 7、查看调用链 8、查看变

    2024年02月02日
    浏览(53)
  • 【Linux】——调试器-gdb的使用

    序言: 本期,我将带领大家学习的关于linux下的 调试器gdb 的使用,废话不多说跟着我一起去看看吧!! 目录 前言 (一)背景介绍 1、debug模式和release模式 2、为什么Release不能调试但DeBug可以调试 3、初步见识 1️⃣readelf (二)调试代码 1、命名大全 2、具体演示 0️⃣行号显

    2024年02月07日
    浏览(41)
  • Linux 使用gdb调试C程序

    一、gdb的一些基础命令 l :显示代码 l n :跳转到当前代码页的第n行的代码 l filename.c :n :跳转到filename.c文件的第n行代码 b 行号 :加断点 info break :查看断点信息 delete 断点编号 :删除断点 r ,运行程序 n ,单步执行 c ,继续执行,遇到断点停止执行 p ,打印 s ,进入函数

    2024年02月13日
    浏览(41)
  • 【Linux】Linux调试器-gdb使用

    程序的发布方式有两种,debug模式和release模式 Linux gcc/g++出来的二进制程序,默认是release模式 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项 退出:  调试命令: list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。 list/l 函数名:列出某

    2024年02月21日
    浏览(50)
  • 【Linux】调试器:gdb 的基本使用

    gdb 全称 GNU symbolic debugger,是 Linux 下常用的程序调试器。 调试器的核心工作,主要是为了定位问题。废话不多说。 gdb 的安装 另外: gcc、g++ 默认形成的版本是 release,不是 debug 版本!所以想要在 Linux 下调试程序,需要在 Makefile 文件 中,添加 -g 选项 指定以 dubug 方式编译程

    2024年02月16日
    浏览(46)
  • 手把手教你使用gdb调试器

    所谓调试,指的是对编好的程序用各种手段进进行查错和排非错的过程。进行这种查错处理时,下面将讲解如何使用gdb进行程序的调试。  gdb 简介 gdb是一个功能强大的调试工具,可以用来调试C程序或C++程序。在使用这个工具进行程序调试时,主要涉及下面四个方面的操作。

    2024年02月16日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包