c语言中的线程池

【C语言】Linux实现高并发处理的过程 一、实现高并发的几种策略 C语言本身并没有内建的多线程支持(新版C语言支持,但用得不多),但是在多数操作系统中,可以使用库来实现多线程编程。例如,在POSIX兼容系统上,可以使用 pthreads 库来创建和管理线程。然而,传统的多线程存在着资源限制,比如每个线程都需要独立的堆栈空间,上下文切换开销大,线程数量多时还会导致竞争情况加剧。 为了兼顾高并发和高性能,可以采取以下几种策略: 1. 线程池(Thread Pools):创建一个线程池来管理一定数量的线程,避免了频繁创建和销毁线程的开销,可以复用线程 阅读详情

c语言中没有线程池,但是项目要用到,于是就从网上找了个代码,根据我的情况改了改,大体可以用了。

大概的过程是这样的。
1)初始化线程池,指定最大线程数;
2)将工作线程添加到线程池的等待队列中;
3)创建线程;
4)依次执行线程,等待队列中没有线程的话,线程就会彻底退出了;
5)等待所有线程结束;
6)销毁线程,退出。


PS: 下面的代码有轻微的内存泄露,有没有人可以找出来,我请他吃饭啊。

代码如下:
#include "log_compute.h"
#include <string>
#include <vector>
#include <map>
#include <fstream>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/types.h>
#include <pthread.h>
#include <assert.h>
using namespace std;
extern sys_conf_t sys_conf;
extern log casmi_log;


typedef struct worker
{
   
    void *(*process) (void *arg);
    void *arg;
    struct worker *next;

} CThread_worker;


typedef struct
{
     pthread_mutex_t queue_lock;
     pthread_cond_t queue_ready;

   
     CThread_worker *queue_head;

   
    int shutdown;
     pthread_t *threadid;
   
    int max_thread_num;
   
    int cur_queue_size;

} CThread_pool;


int pool_add_worker (void *(*process) (void *arg), void *arg);
void *thread_routine (void *arg);
int pool_destroy ();
void pool_init_list (int max_thread_num);
void pool_init_thread();
void pool_wait();

static CThread_pool *pool = NULL;
void
pool_init_list (int max_thread_num)
{
casmi_log.debug("%s(%d)",__FUNCTION__,__LINE__);
     pool = (CThread_pool *) malloc (sizeof (CThread_pool));

     pthread_mutex_init (&(pool->queue_lock), NULL);
     pthread_cond_init (&(pool->queue_ready), NULL);

     pool->queue_head = NULL;

     pool->max_thread_num = max_thread_num;
     pool->cur_queue_size = 0;

     pool->shutdown = 0;

     
}
void
pool_init_thread ()
{
casmi_log.debug("%s(%d)",__FUNCTION__,__LINE__);
pool->threadid =
(pthread_t *) malloc (pool->max_thread_num * sizeof (pthread_t));
int i = 0;
for (i = 0; i < pool->max_thread_num; i++)
{
pthread_create (&(pool->threadid[i]), NULL, thread_routine,
NULL);
casmi_log.debug("%s(%d) created thread 0x%x",__FUNCTION__,__LINE__,pool->threadid[i]);
}
}

int
pool_add_worker (void *(*process) (void *arg), void *arg)
{
casmi_log.debug("%s(%d)",__FUNCTION__,__LINE__);
   
     CThread_worker *newworker =
         (CThread_worker *) malloc (sizeof (CThread_worker));
     newworker->process = process;
     newworker->arg = arg;
     newworker->next = NULL;

     pthread_mutex_lock (&(pool->queue_lock));
   
     CThread_worker *member = pool->queue_head;
    if (member != NULL)
     {
        while (member->next != NULL)
             member = member->next;
         member->next = newworker;
     }
    else
     {
         pool->queue_head = newworker;
     }

     assert (pool->queue_head != NULL);

     pool->cur_queue_size++;
     pthread_mutex_unlock (&(pool->queue_lock));
   
    // pthread_cond_signal (&(pool->queue_ready));
    return 0;
}


int
pool_destroy ()
{
casmi_log.debug("%s(%d)",__FUNCTION__,__LINE__);
    if (pool->shutdown)
        return -1;
     pool->shutdown = 1;

   
     pthread_cond_broadcast (&(pool->queue_ready));

   
    int i;
   
     free (pool->threadid);

   
     CThread_worker *head = NULL;
    while (pool->queue_head != NULL)
     {
         head = pool->queue_head;
         pool->queue_head = pool->queue_head->next;
         free (head);
     }
   
     pthread_mutex_destroy(&(pool->queue_lock));
     pthread_cond_destroy(&(pool->queue_ready));
    
     free (pool);
   
     pool=NULL;
casmi_log.debug("%s(%d)all thread out",__FUNCTION__,__LINE__);
    return 0;
}


void *
thread_routine (void *arg)
{
bool is_start = false;
casmi_log.debug("%s(%d)",__FUNCTION__,__LINE__);
     printf ("starting thread 0x%x\n", pthread_self ());
    while (1)
     {
         pthread_mutex_lock (&(pool->queue_lock));
       
       

       
        if (pool->shutdown)
         {
           
             pthread_mutex_unlock (&(pool->queue_lock));
             printf ("thread 0x%x will exit\n", pthread_self ());
             pthread_exit (NULL);
         }
         printf ("thread 0x%x is starting to work\n", pthread_self ());
if (pool->cur_queue_size <= 0)
{
casmi_log.debug("%s(%d) break 0x%x",__FUNCTION__,__LINE__,pthread_self());
break;
}

       
         assert (pool->cur_queue_size > 0);
         assert (pool->queue_head != NULL);
        
       
         pool->cur_queue_size--;
         CThread_worker *worker = pool->queue_head;
         pool->queue_head = worker->next;
         pthread_mutex_unlock (&(pool->queue_lock));

       
         (*(worker->process)) (worker->arg);
         free (worker);
         worker = NULL;
if (pool->queue_head == NULL)
{
casmi_log.debug("%s(%d) break 0x%x",__FUNCTION__,__LINE__,pthread_self());
break;
//pthread_exit(NULL);
}
     }
   
     //pthread_exit (NULL);
}

void pool_wait()
{
casmi_log.debug("%s(%d)",__FUNCTION__,__LINE__);
while(pool->cur_queue_size)
{
casmi_log.debug("%s(%d) queue size = %d",__FUNCTION__,__LINE__,pool->cur_queue_size);
sleep(1);
}
for (int i = 0; i < pool->max_thread_num;i++)
{
casmi_log.debug("%s(%d) waiting for 0x%x",__FUNCTION__,__LINE__,pool->threadid[i]);
pthread_join (pool->threadid[i], NULL);
}
casmi_log.debug("%s(%d)all thread out",__FUNCTION__,__LINE__);
}
C语言跨平台线程池任务池库 libstpool是一个轻便高效的跨平台 支持win32 linux unix arm 的c语言线程池 任务池库 支持优先级任务 立即下载

相关推荐

c语言跨平台线程池,任务池库libstpool

libstpool是一个轻便高效的支持优先级的,跨平台的c语言 线程池,任务池库.

线程池代码的C实现以及在各种开源框架中的使用

线程池的本质是对任务和线程的管理,而做到这一点最关键的思想就是将任务和线程两者解耦,不让两者直接关联,才可以做后续的分配工作。在一个事件循环中,可以处理多个就绪事件,这些就绪时间在reactor模型中时串行执行的,一个事件处理延时若耗时较长,会延迟其它同时触发的事件的处理(对于客户端而言,响应会变得较慢)。对于线程,内存,oracle的连接对象等等,这些都是资源,程序中当你创建一个线程或者在堆上申请一块内存时,都涉及到很多系统调用,也是非常消耗CPU的,,内存池,连接池,对象池等等。2、线程池的使用场景。

thunderLZM的博客 1049

c语言实现的线程池

c语言线程池入门,根据需要添加自己的任务,支持一定数量的任务

【亲测免费】 推荐一款强大的C语言线程池库:C Thread Pool

在软件开发中,高效地管理多线程是提升性能的关键。今天,我要向大家推荐一个简洁而先进的开源线程池实现:C Thread Pool。这个项目由Pithikos编写,不仅遵循ANSI C和POSIX标准,还提供了易于理解和使用的API,以及经过充分测试的可靠代码。 ## 项目介绍 C Thread Pool是一个轻量级的线程池实现,它允许你在C程序中优雅地管理和调度任务。其主要特性包括线程的暂停、恢...

gitblog_00787的博客 1289

线程池实现,通过C语言实现

linux下通过200行C代码实现简单线程池,附源代码和文档说明: 200行C代码实现简单线程池.doc threadpool.c

从PWM到正弦波:RC低通滤波器的魔法转换之旅

本文详细介绍了如何利用RC低通滤波器将STM32F103生成的PWM信号转换为高质量正弦波的技术原理与实践方法。通过分析滤波器设计、参数计算、硬件实现及Proteus仿真验证,为嵌入式开发者提供了一套完整的PWM转正弦波解决方案,适用于电机控制、音频信号生成等多种应用场景。

jupi8的博客 382

C-Thread-Pool 开源项目教程

C-Thread-Pool 是一个用 ANSI C 编写的轻量级线程池实现。该项目旨在提供一个简单、高效的线程池库,适用于需要多线程处理的应用程序。线程池可以有效地管理线程的创建和销毁,减少系统资源的消耗,提高程序的性能。 ## 项目快速启动 ### 安装和编译 1. **克隆项目仓库**: ```bash git clone https://github.com/Pithi...

gitblog_00819的博客 964

FPGA实现PI控制

FPGA实现PI控制

m0_57319166的博客 3900

c++ 线程池/Github 开源项目源码分析(progschj/ThreadPool)

维基百科上对线程池的简要介绍:线程池(thread pool):一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。ThreadPool 项目地址是一个简易的基于 c++11 标准的线程池实现,采用了。

为啥不吃肉捏 的博客 3734

S7-1200g2运动控制实战:从轴组配置到程序调试

本文详细介绍了S7-1200g2运动控制功能的实战应用,从轴组配置到程序调试的全流程。通过TIA Portal中的工艺对象配置,实现单轴、同步轴组等运动控制模型,并分享常见问题排查与性能优化经验,帮助工程师快速掌握中小型自动化设备的运动控制技术。

weixin_28698059的博客 591

死区补偿---学习笔记

最近调试中发现,死区补偿对电流谐波和电流带宽影响挺大,于是对死区补偿产生浓厚兴趣,找来几篇文章粗读并做一下笔记。 传统做法 无非就是根据电流方向补偿,假如svpwm计算出的A相理论导通实践为T1,死区时间是Td,则实际导通时间T = T1-Td(when ia >0 ),于是在svpwm计算出的导通时间T1的基础上加上Td。这样经过PWM模块后,实际的导通时间即为T1. 但存在两个难点(个人总结): 1,受电流检测精度影响,尤其是在过零点检测困难。 2,真实的二极管导通需要一定电压,并非..

圆桌骑士的博客 2万+

linux下C实现线程池的源代码

ThreadPoolThreadPool头文件:/**//** * threadpool.h * * This file declares the functionality associated with * your implementation of a threadpool. * 线程池的实现 */#ifndef __threadpool_h__#define __threadpo

fuchuangbob的专栏 4078

.NET适配HarmonyOS进展 1. 前言

目前国产化系统浪潮下,适配鸿蒙是中国软件大势所趋,.NET作为最适合开发客户端语言之一,适配鸿蒙系统(HarmonyOS Next)是目前.NET开发者最关心的事情。我目前业余时间正在移植Avalonia到HarmonyOS,去年在.NET Conf CN上分享过,目前又取得一点进展,所以本文把所有问题进行整合与大家进行分享。

2301_76476890的博客 1462

c语言 互斥锁,线程池中的一个互斥锁有关问题

线程池中的一个互斥锁问题12:staticvoid*13:thread_routine(void*arg)14:{15:tpool_work_t*work;16:17:while(1){18:/*如果线程池没有被销毁且没有任务要执行,则等待*/19:pthread_mutex_lock(&tpool->queu...

weixin_36378683的博客 212

单目和多目视觉统一标定

单目和多目视觉统一标定 一.单目视觉标定 在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。在大多数条件下这些参数必须通过实验与计算才能得到,这个求解参数的过程就称之为相机标定(或摄像机标定)。无论是在图像测量或者机器视觉应用中,相机参数的标定都是非常关键的环节,其标定结果的精度及算法的稳定性直接影响相机工作产生结果的准确性。因此,做好相机标定是做好后续工作的前提,提高标定精度是科研工作的重点所在

吴建明wujianming_110117 2911

在Allegro设计界面中如何修改封装焊盘

在高密度板的情况下,SUIPLA(支持内层没有的焊盘摘掉)打勾,在高密度板的情况下,内层没有的焊盘摘掉可以增加走线的空间。3、修改完焊盘后,选择File→Update to Design(更新到设计)。然后关闭焊盘修改对话框即可。,将会定期不定期更新技术文章,互相学习交流。或者点击Options选项卡下要修改的焊盘,然后点击Edit修改。在Allegro PCB设计界面中修改封装焊盘的方法。2、然后点击封装上要修改的焊盘,右击选择Edit。修改完成后如下图所示。

bhxc809751502的博客 7807

《C 语言实现多文件并行 cat:线程池模型在文件读取中的应用》

以下是C语言实现多文件并行cat。

dhjvjkjkjko的博客 214

PID、模糊PID、SkyHook、LQR、H2/H∞、ADRC等悬架控制合集

PID、模糊PID、SkyHook、LQR、H2/H∞等悬架控制合集

Mr.邹的博客 2017

C语言中的线程池与内存池:提升性能与资源管理

在高性能系统中,资源管理和优化至关重要。尤其在需要频繁创建销毁线程和对内存管理比较敏感的场景中,线程池和内存池这两种技术发挥了至关重要的作用。它们的核心思想是:通过预先分配一定数量的线程或内存块,在使用和归还时直接从池中获取和归还资源,而不需要操作系统来频繁地进行分配和释放。这种方法有效地减少了系统调用的开销,避免了频繁创建销毁线程和内存碎片的问题,从而大大提高了程序的效率。

2301_80371156的博客 436

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

线程池C语言笔记

我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务呢?线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。

qq_49692308的博客 672

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【手写线程池 - C 语言版】【转载】

/ 线程池结构体// 任务队列// 容量// 当前任务个数// 队头 -> 取数据// 队尾 -> 放数据// 管理者线程ID// 工作的线程IDint minNum;// 最小线程数量int maxNum;// 最大线程数量// 忙的线程的个数// 存活的线程的个数// 要销毁的线程个数// 锁整个的线程池// 锁busyNum变量// 任务队列是不是满了// 任务队列是不是空了// 是不是要销毁线程池, 销毁为1, 不销毁为0dobreak;

j8267643的博客 880

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【C/C++】线程池实现

1

IdealSanX的博客 1979

【C语言实现线程池】

创建一个线程池是提高多线程应用程序性能的有效方法。一个线程池中包含一定数量的工作线程,这些线程可以复用来处理多个任务,避免了频繁创建和销毁线程所带来的开销。下面是一个基础的线程池实现的框架,使用C语言和POSIX线程库(pthread)。这个简单的线程池会轮询并执行放入队列的任务。 代码说明 结构体定义:线程池工作函数:线程池创建函数:添加任务函数:销毁线程池函数:示例任务:这个基础代码可以满足大部分简单的线程池需求,但在实际应用中,你可能还会需要考虑:这个基础代码是一个很好的起点,你可以在其基础上根据

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 728

Linux下C语言线程池的实现(1)

http://hi.baidu.com/lingiloveyou/blog/item/21e57cf3322a6b40342accc7.html 什么时候需要创建线程池呢?简单的说,如果一个应用需要频繁的创建和销毁线程,而任务执行的时间又非常短,这样线程创建和销毁的带来的开销就不容忽视,这时也是线程池该出场的机会了。如果线程创建和销毁时间相比任务执行时间可以忽...

weixin_33850890的博客 131

【池化技术】线程池技术原理和C语言实现

文章目录一、基础概念进程和线程多进程和多线程区别二、线程池技术 一、基础概念 在讲线程池技术之前,我们先对操作系统中的一些基础概念,比如进程、线程、线程的创建与销毁等进行说明。 进程和线程 进程 一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间,一个进程可以有多个线程,比如在Windows系统中,一个运行的xx.exe就是一个进程。 线程 进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程至少有一个线程,一个进程可以运行多个线程,多个线程可共享数据。 与进程不同的是同类的多个

qq_41854911的博客 1335

C语言实现线程池

上锁后,线程循环检测任务队列是否为空,如果任务队列为空,则通过条件变量让线程处于等待状态,当任务队列中有新任务到来时,线程被唤醒,并从任务队列中拿出一个任务,同时将该任务从任务队列中删除。由于多个线程需要同时向任务队列中获取任务,所以任务队列为临界资源。上锁后,采用双向链表的插入操作,将新任务插入任务队列中,同时采用条件变量,通知唤醒线程队列,有新任务到来。在线程池创建时,会预先创建多个线程,多个线程并不会立刻执行具体的任务,而是进入等待状态,当任务队列有任务时,多个线程会被唤醒,抢夺具体任务的执行权。

m0_64696646的博客 735
下一篇: linux 下遍历文件夹下的所有文件
dds_dev_group
博客等级 码龄15年 4粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值