linux C 简单线程池实现_linux自实现c线程池(linux线程的实现)

linux C 简单线程池实现_linux自实现c线程池int threadPoolAliveNum(ThreadPool* pool);
// // 工作的线程(消费者线程)任务函数 void* worker(void* arg); /

int threadPoolAliveNum(ThreadPool* 池);

//

//工作线程(消费者线程)任务函数

无效*工人(无效*参数);

//管理线程任务函数

无效*经理(无效*参数);

//单线程结束

void threadExit(ThreadPool* 池);

#endif //_THREADPOOL_H

线程池.c

#include“threadpool.h”

#include stdio.h

#包括stdlib.h

#include 字符串.h

#include unistd.h

无效任务Func(无效*参数)

{

int num=*(int*)arg;

printf(“线程%ld 正在运行,编号=%d\\n”,

pthread_self(), num);

睡眠(1);

}

int main()

{

//创建线程池

ThreadPool* 池=threadPoolCreate(3, 10, 100);

for (int i=0; i 100; ++i)

{

int* num=(int*)malloc(sizeof(int));

*数字=i + 100;

threadPoolAdd(池,taskFunc,num);

}

睡觉(30);

线程池销毁(池);

返回0。

}

线程池* threadPoolCreate(int min, int max, int queueSize)

{

ThreadPool* 池=(ThreadPool*)malloc(sizeof(ThreadPool));

{

如果(池==NULL)

{

printf(“malloc 线程池失败.\\n”);

休息;

}

池线程ID=(pthread\\_t\\*)malloc(sizeof(pthread\\_t) \\* max);

if (池线程ID==NULL)

{

printf(\’malloc 线程ID 失败.\\n\’);

休息;

}

memset(池线程ID, 0, sizeof(pthread\\_t) \\* max);

Pool MinutesNum=分钟;

poolmax_number=最大;

池忙号=0;

pool-liveNum=min //等于最小数量。

池出口号=0;

if (pthread\\_mutex\\_init(pool-mutexPool, NULL) !=0 ||

pthread\\_mutex\\_init(pool-mutexBusy, NULL) !=0 ||

pthread\\_cond\\_init(池-notEmpty, NULL) !=0 ||

pthread\\_cond\\_init(池未满,NULL)!=0)

{

printf(\’初始化互斥体或条件失败.\\n\’);

休息;

}

//任务队列

pool-taskQ=(任务\\*)malloc(sizeof(任务)\\* 队列大小);

池队列容量=队列大小;

池队列大小=0;

池提示前端=0;

池库里亚=0;

池关闭=0;

//创建线程

pthread\\_create(池管理器ID, NULL, 管理器, 池);

for (int i=0; i 分钟; ++i)

{

pthread\\_create(池线程ID[i], NULL, 工作线程, 池);

}

返回池。

而(0);

//释放资源

if (池池线程ID) free(池线程ID);

if (池pool-taskQ) free(池-taskQ);

如果(池)空闲,则(池);

返回NULL。

}

int threadPoolDestroy(ThreadPool* 池)

{

如果(池==NULL)

{

返回-1。

}

//关闭线程池

池关闭=1;

//阻塞回收管理器线程

pthread\\_join(池管理器ID, NULL);

//启动被阻塞的消费者线程

for (int i=0; i pool-liveNum; ++i)

{

pthread\\_cond\\_signal(池-notEmpty);

}

//释放堆内存

if (池-任务Q)

{

自由(池任务Q);

}

if(池线程ID)

{

free(池线程ID);

}

pthread\\_mutex\\_destroy(pool-mutexPool);

pthread\\_mutex\\_destroy(pool-mutexBusy);

pthread\\_cond\\_destroy(池-notEmpty);

pthread\\_cond\\_destroy(池未满);

免费(池);

池=空;

返回0。

}

void threadPoolAdd(ThreadPool* 池, void(*func)(void*), void* arg)

{

pthread_mutex_lock(池-mutexPool);

while(池队列大小==池队列容量!池关闭)

{

//阻塞生产者线程

pthread_cond_wait(pool-notFull, pool-mutexPool);

}

if(关闭池)

{

pthread_mutex_unlock(池-mutexPool);

返回;

}

//添加任务

池任务Q[池队列].function=func;

池任务Q[池队列].arg=arg;

池队列=(池队列+ 1) % 池队列容量;

池队列大小++;

pthread\\_cond\\_signal(池-notEmpty);

pthread\\_mutex\\_unlock(池-mutexPool);

}

int threadPoolBusyNum(ThreadPool* 池)

{

pthread_mutex_lock(pool-mutexBusy);

intbusyNum=池忙号;

pthread_mutex_unlock(pool-mutexBusy);

返回占线号码。

}

int threadPoolAliveNum(ThreadPool* 池)

{

pthread_mutex_lock(池-mutexPool);

int liveNum=池活数;

pthread_mutex_unlock(池-mutexPool);

返回实时号码;

}

void* 工人(void* 参数)

{

线程池*池=(线程池*)arg;

另一方面(1)

{

pthread\\_mutex\\_lock(池-mutexPool);

//当前任务队列是否为空

while(池队列大小==0!池关闭)

{

//阻塞工作线程

pthread\\_cond\\_wait(pool-notEmpty, pool-mutexPool);

//决定是否销毁线程

if (池出口号0)

{

水池出口号——;

if (池-liveNum 池-minNum)

{

池直播号码–;

pthread\\_mutex\\_unlock(池-mutexPool);

线程结束(池);

}

}

}

//判断线程池是否关闭

if(关闭池)

{

pthread\\_mutex\\_unlock(池-mutexPool);

线程结束(池);

}

//从任务队列中删除任务

任务任务;

task.function=池任务Q[池队列前端].function;

task.arg=pool-taskQ[pool-queuefront].arg;

//移动头节点

池队列前端=(池队列前端+ 1) % 池队列容量;

池队列大小–;

//开锁

pthread\\_cond\\_signal(池未满);

pthread\\_mutex\\_unlock(池-mutexPool);

printf(\’线程%ld 已开始工作.\\n\’, pthread\\_self());

pthread\\_mutex\\_lock(pool-mutexBusy);

池忙数++;

pthread\\_mutex\\_unlock(pool-mutexBusy);

任务.函数(任务.arg);

自由(任务.arg);

任务.arg=NULL;

printf(\’线程%ld 已完成工作.\\n\’, pthread\\_self());

pthread\\_mutex\\_lock(pool-mutexBusy);

池忙号码–;

pthread\\_mutex\\_unlock(pool-mutexBusy);

}

返回NULL。

}

void* 经理(void* 参数)

{

线程池*池=(线程池*)arg;

同时(!池关闭)

{

//每3秒检测一次

睡眠(3);

//获取线程池中的任务数和当前线程数

pthread\\_mutex\\_lock(池-mutexPool);

int queueSize=池队列大小;

int liveNum=池活数;

pthread\\_mutex\\_unlock(池-mutexPool);

//获取繁忙线程数

pthread\\_mutex\\_lock(pool-mutexBusy);

intbusyNum=池忙号;

pthread\\_mutex\\_unlock(pool-mutexBusy);

//添加线程

//任务数、存活线程数、存活线程数、最大线程数

if (队列大小liveNum liveNum 最大池数)

{

pthread\\_mutex\\_lock(池-mutexPool);

整数计数器=0;

我们专门整理了上百道【运维技术栈面试题】,成为您运维面试路上的好助手。这样,你就可以毫无惊慌地参加面试并获得高薪offer。

这些面试题涵盖了从Shell、MySQL到K8s等云原生技术栈,适合运维行业新人以及运维行业新人的面试需求。升职或换工作以增加薪水。

本次访谈集内容为

174 运维工程师面试题128 k8s 面试题108 shell 脚本面试题200 Linux 面试题51 Docker 面试题35 Jenkis 面试题78 MongoDB 面试题17 ansible 面试题60 dubbo 面试题53 Kafka 面试题18 mysql 面试题40 nginx面试题题77 redis面试题Zookeeper题28

总共1000多道面试题,内容全面且有价值。

174道运维工程师面试题

1.什么是运维?

2、运维人员在工作场所经常需要与操作人员进行交互。运营人员做什么工作?

3. 您目前有300台服务器,您如何管理它们?

4. 简要说明RAID0和Raid1raid5这两种工作模式的工作原理和特点。

5、LVS、Nginx、HAproxy有什么区别?

6. Squid、Varinsh、Nginx 有什么区别,你在工作中如何选择?

7.Tomcat和Resin有什么区别?

8.什么是中间件?

9、Tomcat中的8005、8009、8080这三个端口是什么意思?

10.什么是CDN?

11.什么是网站灰度发布?

12、请简单说明一下DNS域名解析的过程。

13.什么是RabbitMQ?

14.Keepalived如何工作?

15.描述LVS工作流程的三种模式。

16、mysql的innodb如何识别锁定问题以及mysql如何减少主从复制延迟?

工作中你会如何选择?

6. Squid、Varinsh、Nginx 有什么区别,你在工作中如何选择?

7.Tomcat和Resin有什么区别?

8.什么是中间件?

9、Tomcat中的8005、8009、8080这三个端口是什么意思?

10.什么是CDN?

11.什么是网站灰度发布?

12、请简单说明一下DNS域名解析的过程。

13.什么是RabbitMQ?

14.Keepalived如何工作?

15.描述LVS工作流程的三种模式。

16、mysql的innodb如何识别锁定问题以及mysql如何减少主从复制延迟?

17.如何重置mysql root密码?

#以上关于在Linux C中实现简单线程池的信息是关于内容源网络的,因为它与Linux中自行实现的C线程池有关。相关信息请参见官方公告。

原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/92028.html

(0)
CSDN的头像CSDN
上一篇 2024年6月24日
下一篇 2024年6月24日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注