函数tpool_thread定义了工作线程的函数,其中真正与实际任务有关的只有一行代码:

(*(my_work->handler_routine))(my_work->arg);

即执行my_work->handler_routine指针指向的函数,并传入参数my_work->arg.其他的步骤都是为执行这个任务而进行的各种设置和准备.

void *tpool_thread(void *tpool)

{

tpool_work_t *my_work;

tpool_t *pool = (struct tpool *)tpool;

for(;;)

{/* 线程内循环 */

pthread_mutex_lock(&(pool->queue_lock));

/* 如果任务列表为0,并且线程池没有关闭,则一直等待,直到任务到来为止  */

while((pool->cur_queue_size == 0) && (!pool->shutdown))

{

pthread_cond_wait(&(pool->queue_not_empty), &(pool->queue_lock));

}

/* 线程池是否已经关闭,如果线程池关闭则线程自己主动关闭 */

if(pool->shutdown)

{

pthread_mutex_unlock(&(pool->queue_lock));

pthread_exit(NULL);      /*线程退出状态为空,主线程不捕获各副线程状态*/

}

my_work = pool->queue_head;

pool->cur_queue_size--;

/*将任务链表头部去掉,改任务正在处理中*/

if(pool->cur_queue_size == 0)

pool->queue_head = pool->queue_tail = NULL;

else

pool->queue_head = my_work->next;

/* 任务链表还没有满 */

if((!pool->do_not_block_when_full) &&\

(pool->cur_queue_size == (pool->max_queue_size - 1)))

{

pthread_cond_broadcast(&(pool->queue_not_full));

}

/*任务链表为空*/

if(pool->cur_queue_size == 0)

{

pthread_cond_signal(&(pool->queue_empty));

}

pthread_mutex_unlock(&(pool->queue_lock));

/*启动线程业务处理逻辑*/

(*(my_work->handler_routine))(my_work->arg);

free(my_work);

}

return(NULL);

}

linux的多任务编程-线程池,Linux的多任务编程-线程池相关推荐

  1. Linux下套接字详解(七)----线程池accept处理高并发connect

    前言 服务器在调用listen和accept后,就会阻塞在accept函数上,accpet函数返回后循环调用accept函数等待客户的TCP连接. 我们知道服务器段listen套接字能处理的连接数与监 ...

  2. Linux环境,C/C++语言手写代码实现线程池

    前言 在我们日常生活中会遇到许许多多的问题,如果一个服务端要接受很多客户端的数据,该怎么办?多线程并发内存不够怎么办?所以我们需要了解线程池的相关知识. 一.线程池是什么? 1.线程池的简介 线程池是 ...

  3. Linux下的C编程实战(开发平台搭建,文件系统编程,进程控制与进程通信编程,“线程”控制与“线程”通信编程,驱动程序设计,专家问答)

    Linux下的C编程实战(一) ――开发平台搭建 1.引言 Linux操作系统在服务器领域的应用和普及已经有较长的历史,这源于它的开源特点以及其超越Windows的安全性和稳定性.而近年来,Linux ...

  4. linux线程并不真正并行,Linux系统编程学习札记(十二)线程1

    Linux系统编程学习笔记(十二)线程1 线程1: 线程和进程类似,但是线程之间能够共享更多的信息.一个进程中的所有线程可以共享进程文件描述符和内存. 有了多线程控制,我们可以把我们的程序设计成为在一 ...

  5. Linux C :线程操作和线程同步的多线程并发编程

    在这之前可以先看看这边文章了解线程概念,信号量,条件变量,死锁.管程等概念 https://blog.csdn.net/superSmart_Dong/article/details/11666837 ...

  6. linux线程 ppt,Linux多线程编程多核编程.ppt

    <Linux多线程编程多核编程.ppt>由会员分享,可在线阅读,更多相关<Linux多线程编程多核编程.ppt(28页珍藏版)>请在装配图网上搜索. 1.Linux多线程编程, ...

  7. Linux系统编程---13(线程控制函数,创建线程,循环创建多个线程,线程间共享全局变量)

    线程控制 操作系统并没有提供创建线程的系统调用接口,因此大佬们封装了一个线程的接口库实现线程控制.意为着用户创建线程都使用的是库函数(所以有时候我们说创建的线程是一个用户态线程,但是在内核中对应有一个 ...

  8. 【Linux系统编程学习】Linux线程控制原语

    此为牛客Linux C++课程笔记. 0. 关于线程 注意:LWP号和线程id不同, LWP号是CPU分配时间片的依据,线程id是用于在进程内部区分线程的. 1. 线程与进程的区别 对于进程来说,相同 ...

  9. linux c 网络编程与信号量,linux网络编程-----线程同步--信号量

    开发使用多线程过程中, 不可避免的会出现多个线程同时操作同一块共享资源, 当操作全部为读时, 不会出现未知结果, 一旦当某个线程操作中有写操作时, 就会出现数据不同步的事件. 而出现数据混乱的原因:资 ...

  10. C# SmartThreadPool线程池技术实现多任务批量处理

    一.多线程技术应用场景介绍 本期同样带给大家分享的是阿笨在实际工作中遇到的真实业务场景,请跟随阿笨的视角去如何采用基于开源组件SmartThreadPool线程池技术实现多任务批量处理.在工作中您是否 ...

最新文章

  1. linux驱动:i2c驱动(四)流程图之注册驱动
  2. [网络流24题] 最长k可重区间集
  3. python3基础题目,Python3.x 基础练习题100例(91-100)
  4. 【Linux环境下安装Maven与环境配置简易教程】
  5. 【51单片机快速入门指南】4.3.1: MPU6050调用DMP库获取四元数和欧拉角
  6. 搭建简单Django服务并通过HttpRequester实现GET/POST http请求提交表单
  7. unity3d 几种镜头畸变
  8. linux 下的挂载
  9. l2高斯分布_浅谈为什么L2正则化有效
  10. 第二单元答案计算机基础,《计算机基础》资源包-第二单元课后题答案.docx
  11. 分支限界算法c语言_算法分析
  12. JavaWeb:Filter和Listener
  13. HBuilder开发APP(二)——网络请求
  14. python模拟登陆steam
  15. Bus Hound使用心得#抓包工具#协议抓取
  16. ACM-水题 Demacia of the Ancients
  17. 什么是全国大学生电子设计大赛?如何备战?
  18. 计算机用老毛桃u盘备份系统,老毛桃u盘启动盘ghost备份系统操作步骤
  19. 爱因斯坦广义相对论:引力是时空的曲率
  20. word2016拼音指南功能无效解决方案

热门文章

  1. Theatre.js 动画JavaScript库
  2. Web Activities 简介
  3. exe电子书转换txt 下载_网站能经常看到的主流电子书格式
  4. 多个服务器数据互通_数据中心
  5. mpi并行 写同一文件_并行计算调度策略的笔记(001)
  6. python列表添加对象_python list append命令 添加对象
  7. 在Ubuntu Server14.04上编译Android6.0源码
  8. 亡命逃窜---三维搜索
  9. 转:关于Apache与Nginx的优势比较(经典)
  10. EasyPR中文车牌识别系统开发