#include

#include

#include

#include

#include

#include

//定义链表操作add delete 宏函数

//定义添加宏函数

#define LL_ADD(item, list) do {\

item->prev = NULL;\

item->next = list;\

if (list != NULL) list->prev = item;\

list = item;\

} while (0)

//定义删除宏函数

#define LL_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)

//定义Worker链表,双向链表

typedef struct NWORKER {

pthread_t threadid; //线程id

int terminate; //退出机制,标志位 释放线程,将terminate置1

struct NMANAGER *pool; //定义一个双向链表

struct NWORKER *next;

struct NWORKER *prev;

} nWorker;

typedef struct NJOB {

void (*func)(void *arg); //回调函数,分析这个的功能? void (*func)(void ):是个指向函数地址的指针,此函数地址是线程开始执行的起始函数地址。起始函数的地址由func确定。

void *user_data; //

struct NJOB *next;

struct NJOB *prev;

} nJob;

typedef struct NMANAGER {

nWorker *workers;

nJob *jobs;

int sum_thread; // 总数

int free_thread; //free_thread = sum_thread;

pthread_mutex_t jobs_mtx; //引入互斥量

pthread_cond_t jobs_cond; //引入条件变量,线程挂起就是因为条件变量

} nManager;

typedef nManager nThreadPool; //取别名

void *nWorkerCallback(void *arg) {

nWorker *worker = (nWorker*)arg;

while (1) {

// jobs != null

pthread_mutex_lock(&worker->pool->jobs_mtx);

while (worker->pool->jobs == NULL) { //任务队列为空

if (worker->terminate == 1) break; //terminate用法

pthread_cond_wait(&worker->pool->jobs_cond, &worker->pool->jobs_mtx); //条件等待

}

if (worker->terminate == 1) {

pthread_mutex_unlock(&worker->pool->jobs_mtx);

break;

}

// ll_remove(item, jobs)

nJob *job = worker->pool->jobs;

LL_REMOVE(job, worker->pool->jobs);

pthread_mutex_unlock(&worker->pool->jobs_mtx);

// enter

worker->pool->free_thread --;

job->func(job->user_data); //不断执行任务

// end

worker->pool->free_thread ++;

free(job);

// jobs->func(jobs);

}

free(worker);

}

int nThreadPoolCreate(nThreadPool *pool, int numWorkers) {

if (pool == NULL) return -1;

if (numWorkers < 1) numWorkers = 1;

memset(pool, 0, sizeof(nThreadPool)); //

pthread_mutex_t blank_mutex = PTHREAD_MUTEX_INITIALIZER;

memcpy(&pool->jobs_mtx, &blank_mutex, sizeof(pthread_mutex_t));

pthread_cond_t blank_cond = PTHREAD_COND_INITIALIZER;

memcpy(&pool->jobs_cond, &blank_cond, sizeof(pthread_cond_t));

int i = 0;

for (i = 0;i < numWorkers;i ++) {

nWorker *worker = (nWorker*)malloc(sizeof(nWorker));

if (worker == NULL) {

perror("malloc");

return 1;

}

memset(worker, 0, sizeof(nWorker));

int ret = pthread_create(&worker->threadid, NULL, nWorkerCallback, worker);

if (ret) {

perror("pthread_create");

//free(worker);

nWorker *w = pool->workers;

for (w = pool->workers; w != NULL; w = w->next) {

w->terminate = 1;

}

return 1;

}

LL_ADD(worker, pool->workers);

}

return 0;

}

int nThreadPoolDestory(nThreadPool *pool) {

nWorker *w = pool->workers;

for (w = pool->workers; w != NULL; w = w->next) {

w->terminate = 1;

}

pthread_mutex_lock(&pool->jobs_mtx);

pthread_cond_broadcast(&pool->jobs_cond);

pthread_mutex_unlock(&pool->jobs_mtx);

}

int nThreadPoolPushJob(nThreadPool *pool, nJob *job) {

pthread_mutex_lock(&pool->jobs_mtx);

LL_ADD(job, pool->jobs);

pthread_cond_signal(&pool->jobs_cond);

pthread_mutex_unlock(&pool->jobs_mtx);

}

//增加线程API

int nThreadpoolADDitem( ){

}

// API

// int nThreadPoolCreate(nThreadPool *pool, int numWorkers)

// int nThreadPoolPushJob(nThreadPool *pool, nJob *job)

// int nThreadPoolDestory(nThreadPool *pool)

c语言线程原理,线程池的原理和实现c语言相关推荐

  1. 线程池的原理及实现(转)

    1.线程池简介:     多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.         假设一个服务器完成一项任务所需时间为:T1 ...

  2. Java线程池实现原理及其在美团业务中的实践

    来自:美团技术团队 随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流.使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器.J.U.C提供的线程池ThreadPoolExecuto ...

  3. 写的很好!细数 Java 线程池的原理

    今天我们就来详细讲解一下Java的线程池,首先我们从最核心的ThreadPoolExecutor类中的方法讲起,然后再讲述它的实现原理,接着给出了它的使用示例,最后讨论了一下如何合理配置线程池的大小. ...

  4. Java的Executor框架和线程池实现原理

    一,Java的Executor框架 1,Executor接口 public interface Executor {void execute(Runnable command);} Executor接 ...

  5. Java 线程池(ThreadPoolExecutor)原理分析与使用

    ThreadPoolExecutor原理概述 在我们的开发中"池"的概念并不罕见,有数据库连接池.线程池.对象池.常量池等等.下面我们主要针对线程池来一步一步揭开线程池的面纱. 使 ...

  6. ScheduledThreadPoolExecutor定时任务线程池执行原理分析

    一.示例代码 @Slf4j public class ScheduleThreadPoolTest {private static ScheduledExecutorService executor ...

  7. java多线程总结五:线程池的原理及实现

    1.线程池简介:     多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.         假设一个服务器完成一项任务所需时间为:T1 ...

  8. Java 线程池的原理与实现

    最近在学习线程池.内存控制等关于提高程序运行性能方面的编程技术,在网上看到有一哥们写得不错,故和大家一起分享. [分享]Java 线程池的原理与实现 这几天主要是狂看源程序,在弥补了一些以前知识空白的 ...

  9. 【Java线程】线程池的原理和实现

    1.为什么要使用线程池? 线程池是Java5提供的一个新技术,方便我们快速简洁的定义线程池. 诸如 Web 服务器.数据库服务器.文件服务器或邮件服务器之类的许多服务器应用程序都面向处理来自某些远程来 ...

  10. 线程池的原理和连接池的原理

    线程池的原理: 来看一下线程池究竟是怎么一回事?其实线程池的原理很简单,类似于操作系统中的缓冲区的概念,它的流程如下:先启动若干数量的线程,并让这些线程都处于睡 眠状态,当客户端有一个新请求时,就会唤 ...

最新文章

  1. 微软的system类库和java_Java常用类库----System 类
  2. Altair PollEx 2020中文版
  3. c语言入门数组,C语言入门之数组(2)
  4. 蓝桥杯 java 组素数,2018 蓝桥杯省赛 B 组模拟赛(五) B 结果填空:素数个数
  5. scrapy通过item类直接创建数据库中的数据表
  6. [Spring Boot系列]1. 项目搭建之一
  7. 在项目中使用redis的原因
  8. java引用微信支付的p12证书文件
  9. Call to localhost/127.0.0.1:9000 failed on connection exception:java.net.ConnectException的解决方案
  10. 黑马程序员:java基础学习——数组
  11. 打分现场流程策划及排练大致流程-仅参考
  12. Kinect初识 整理总结
  13. 小西笔划输入法 一款可以让你像打五笔那样打笔划输入法的
  14. 看看别人家的待遇,字节跳动薪酬体系我真的酸了
  15. 大一计算机考试题库打字题,大一计算机考试题库
  16. SCI、EI论文框架
  17. 微信自定义分享--失效问题
  18. 线程同步的几种实现方法
  19. php 解压dat,如何打开dat文件?
  20. SQL查询(嵌套查询)

热门文章

  1. 关于ListCtrol自绘的技巧
  2. 挑战性题目DSCT301:求不同形态的二叉树数目
  3. Luogu5816 [CQOI2010]内部白点
  4. 黑马vue实战项目-(五)参数列表组件的开发
  5. 负载均衡的几种方式_负载均衡的几种类型
  6. python3file函数_Python3 File(文件) 方法
  7. 事务方法调用事务方法_实现系统调用的几种方法
  8. 字符串初始化_触发类初始化的几个面试坑
  9. SpringMVC的Restful风格
  10. sql_存储过程、函数、分支、循环