发一下牢骚和主题无关:

考参他人的方法,自己做了简略修改,现实一个通用的线程队列。

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>#define POOL_SIZE 10
#define QUEUE_LEN 20
pthread_mutex_t queue_lock; //队列锁
pthread_cond_t  queue_cond; //条件量变int head = 0, tail = 0;
int queue[QUEUE_LEN];void delay(int x)
{int i,j;for(i = 0; i < x; i++)for(j = 0; j <x; j++);
}void fun1(){printf("fun1 start\n");delay(1000);printf("fun1 end\n");
}void fun2(){printf("fun2 start\n");delay(2000);printf("fun2 end\n");
}void fun3(){printf("fun3 start\n");delay(3000);printf("fun3 end\n");
}void fun4(){printf("fun4 start\n");delay(4000);printf("fun4 end\n");
}int dequeue()//出对列函数
{int y;pthread_mutex_lock(&queue_lock);while(head == tail)//队列中 无情求时,待等{pthread_cond_wait(&queue_cond, &queue_lock);//动自释放锁        }y = queue[++head];//需做循环处置  queue[head] is NULLif(head >= QUEUE_LEN)head = 0;pthread_mutex_unlock(&queue_lock);return y;
}void * process_queue(void *arg)
{int x = 0;for(;;){x = dequeue();printf("%d dequeue \n",x);switch(x){case 1:fun1(); break;case 2:fun2(); break;case 3:fun3(); break;default:fun4(); break;}     }
}int enqueue(int x)//插入求请
{int next;pthread_mutex_lock(&queue_lock);next = tail + 1;if(next >= QUEUE_LEN)next = 0;if(next == head){pthread_cond_signal(&queue_cond);//pthread_mutex_unlock(&queue_lock);   return 0;// 示表队列已满}queue[next] = x;tail = next; pthread_cond_signal(&queue_cond);//激活pthread_mutex_unlock(&queue_lock);return 1;//入队胜利
}int main()
{int i;int num = 0;pthread_t tid[POOL_SIZE];pthread_mutex_init(&queue_lock, NULL);pthread_cond_init(&queue_cond, NULL);for(i = 0; i < POOL_SIZE; i++)pthread_create(&tid[i], NULL, process_queue, NULL);while(1){scanf("%d",&num);if(0 == num)// break;return 0;printf("%d ",num);while(!enqueue(num))//队列满时 待等{printf("queue is full\n");sleep(1);}}//  for(i = 0; i < POOL_SIZE; i++)
//      pthread_join(tid[i], NULL);//   pthread_mutex_destory(&queue_lock);
//  pthread_cond_destroy(&queue_cond);return 0;
}

还有一些不足之处,随后补上。

测试方法:

键入 :

4 3 2 1

结果:
4 3 2 1 4 dequeue
fun4 start
3 dequeue
fun3 start
2 dequeue
fun2 start
1 dequeue
fun1 start
fun1 end
fun2 end
fun3 end
fun4 end

键入:

0

退出函数

文章结束给大家分享下程序员的一些笑话语录: 古鸽是一种搜索隐禽,在中国快绝迹了…初步的研究表明,古鸽的离去,很可能导致另一种长着熊爪,酷似古鸽,却又习性不同的猛禽类——犤毒鸟

队列、函数-多线程 线程队列的实现-by小雨相关推荐

  1. java多线程消息队列_java多线程消息队列的实现

    1.定义一个队列缓存池: private static List queueCache = new LinkedList(); 2.定义队列缓冲池最大消息数,如果达到该值,那么队列检入将等待检出低于该 ...

  2. Python 线程队列 Queue – FIFO - Python零基础入门教程

    目录 一.Python 线程队列分类 二.Python 线程先进先出队列 Queue 简介 三.Python 线程先进先出队列 Queue 常用函数 四.Python 线程先进先出队列 Queue 使 ...

  3. python多线程队列和池_Python3 从零单排28_线程队列进程池线程池

    1.线程队列 线程队列有三种:先进先出,后进先出,按优先级进出,具体如下: 1 importqueue2 3 #先进先出 4 q = queue.Queue(3)5 6 q.put(1)7 q.put ...

  4. python多线程队列处理_Python线程和队列使用的一点思考

    Python线程和队列使用的一点思考 1. 斗哥采访环节请问为什么要使用线程? 答:为了提高程序速度,代码效率呀. 请问为什么要使用队列? 答:个人认为队列可以保证线程安全,实现线程间的同步,比较稳. ...

  5. Python之路 34:并发与并行、锁(GIL、同步锁、死锁与递归锁)、信号量、线程队列、生消模型、进程(基础使用、进程通信、进程池、回调函数)、协程

    内容: 同步锁 死锁.递归锁 信号量和同步对象(暂时了解即可) 队列------生产者和消费者模型 进程(基础使用.进程通信.进程池.回调函数) 协程 一.并发并行与同步异步的概念 1.1.并发和并行 ...

  6. 0820Python总结-线程队列,进程池和线程池,回调函数,协程

    一.线程队列 from queue import Queue put 存 get 取 put_nowait 存,超出了队列长度,报错 get_nowait 取,没数据时,直接报错 Linux Wind ...

  7. 【Linux入门】多线程(线程概念、生产者消费者模型、消息队列、线程池)万字解说

    目录 1️⃣线程概念 什么是线程 线程的优点 线程的缺点 线程异常 线程异常 Linux进程VS线程 2️⃣线程控制 创建线程 获取线程的id 线程终止 等待线程 线程分离 3️⃣线程互斥 进程线程间 ...

  8. python多线程为什么要用队列_Python程序中的线程操作-线程队列

    一.线程队列 queue队列:使用import queue,用法与进程Queue一样 queue is especially useful in threaded programming when i ...

  9. Tensorflow多线程输入数据处理框架(一)——队列与多线程

    参考书 <TensorFlow:实战Google深度学习框架>(第2版) 对于队列,修改队列状态的操作主要有Enqueue.EnqueueMany和Dequeue.以下程序展示了如何使用这 ...

最新文章

  1. nginx和mysql链接_nginx转发mysql连接
  2. Unbutu下安装mysql服务并允许远程登录
  3. Java实现螺旋矩阵
  4. 服务器所有文件,检索服务器端文件夹中的所有文件
  5. 深度学习基本概念笔记
  6. 64位ubuntu arm-linux-gcc,在ubuntu 64位的机器上执行arm-linux-gcc提示 no such file or directory【转】...
  7. 40vf什么意思_变频器的VF模式是什么意思?VF什么意思
  8. 【英语学习】【Daily English】U13 Holiday L04 How was it?
  9. 学习成为一个IT架构师
  10. 营业执照psd模板2020_荣誉证书聘书奖状模板,CFR矢量素材PSD源文件,700张精美套用...
  11. php树形结构数组转化
  12. 使用post访问不到接口_Postman调试依赖登录接口的3种方法
  13. python之Character string
  14. Java学习笔记——多线程
  15. WIN7下odbc数据源配置问题
  16. 如何在中国大陆三大运营商申请公网IPV4地址
  17. java泛型(1) 认识泛型
  18. 【100+ python基础入门-32】元组元素的增删改查操作方法总结
  19. Android 天气APP(十九)更换新版API接口(更高、更快、更强)
  20. matlab carcasonne,【My songs】原创英文歌词翻译

热门文章

  1. 解决微信小程序新建项目没有样式问题,以及官方demo
  2. 奔腾双核linux服务器,Dell推出双核心奔腾服务器
  3. php date函数实现,PHP date() 函数可实现的功能列表
  4. huffman算法c语言实验报告,huffman二叉树实验报告--数据结构(c语言).doc
  5. 喜用神最正确的算法_各种电磁仿真算法的优缺点和适用范围(FDTD, FEM和MOM等)...
  6. jsp九大内置对象与servlet中java对象
  7. 服务器怎么修改密码_亚马逊账号登陆不上,修改密码后遭冻结怎么办?有没有什么申诉的办法?...
  8. 【2017年第4期】工业大数据技术与架构
  9. 【2017年第3期】专题:面向社会治理和服务的大数据
  10. 获奖者:​郑纬民,男,清华大学教授、博士生导师,《大数据》杂志主编。...