设计一条简单的等待工作队列之软件模型设计与实现(三)
来源:互联网 发布:淘宝i7 7700k那么便宜 编辑:程序博客网 时间:2024/06/05 14:23
http://blog.csdn.net/morixinguan/article/details/77758206
http://blog.csdn.net/morixinguan/article/details/77783311
在前面两篇文章中,可能考虑到后面需要设计复杂的工作队列,所以加入了线程机制。但由于设计的是一条简单的等待工作队列,却用到了线程,其实没有必要,线程在这个地方反倒是有点浪费资源,干脆可以不使用它,而将实现出队的操作如下,这样也可以实现同样的效果。
//逐个出队 //出队 queue_list *De_queue(queue_list *header){int ret ;int count = 0;int queue_length = 0;queue_list *p = header ;queue_list *prev = NULL ;//如果当前节点的下一个节点为空,则返回空 if(header->next == NULL){free(header);header = NULL ;printf("header mem:0x%p\n",header);return header ;}prev = p ;p = p->next ;//执行工作 p->work_queue.queue_st(p);//延迟放在这里,一个工作执行完,有可能要等待一下,延迟可以放在这里 p->work_queue.work_sleep(p);//获取队列的长度 queue_length = Get_queue_Length(header);queue_length = queue_length - 1;header->queue_length = queue_length ;printf("当前队列的长度:%d %d\n",queue_length,header->queue_length);prev->next = p->next ;free(p);return prev ;}//执行工作
p->work_queue.queue_st(p);
//延迟放在这里,一个工作执行完,有可能要等待一下,延迟可以放在这里
p->work_queue.work_sleep(p);
如果该任务没有产生延迟,则在创建任务结构体初始化的时候,将工作者结构体中的sec初始化为0即可,这样,在入队操作的时候,注册工作者结构体:
New->work_queue.sec = workArray->sec ;
New->work_queue.work_sleep = workArray->work_sleep ;
此时将sec注册为0,则work_sleep最终调用的sleep为0,即相当于不产生延迟,也可以判断sec,如果注册的sec为0,则不调用work_sleep()中的:
sleep(header->work_queue.sec);函数进行传参了,直接返回即可,这样就少调用sleep函数一次,提高了程序的效率:
//每一个工作所对应的时间 void work_sleep(queue_list *header){if(0 == header->work_queue.sec)return ;sleep(header->work_queue.sec);}如果后面的队列设计得更加复杂,可能考虑到队列会产生阻塞,休眠的结果,则到时候需要设计一个唤醒队列的机制,就需要进程间通信的知识支持了。
阅读全文
0 0
- 设计一条简单的等待工作队列之软件模型设计与实现(三)
- 设计一条简单的等待工作队列之软件模型设计与实现(一)
- 设计一条简单的等待工作队列之软件模型设计与实现(二)
- android实验三 简单聊天记录的设计与实现
- 消息队列的设计与实现
- 消息队列的设计与实现
- 循环队列的设计与实现
- [WebKit]WebCore之页面加载的设计与实现(三)
- Android Binder机制の设计与实现8-9(数据包接收队列与等待队列管理/总结)
- /LGC设计模式/消息队列的设计与实现
- 基本模型机的设计与实现
- 【算法设计-优先队列】优先队列的实现与操作
- 简单易用的消息队列框架的设计与实现
- 消息队列设计与实现
- 《Linux内核设计与实现》笔记——CPU的三种工作状态
- 等待队列与工作队列实例
- 简单休眠之等待队列
- 简单虚拟文件系统的设计与实现
- 常用的maven命令如下
- 笔试题
- WOJ1087-数星星
- 输入两个整数 n 和 m,从数列 1,2,3.......n 中 随意取几个数, 使其和等于 m
- linux查看分区或磁盘的block和inode的大小和软硬连接区别
- 设计一条简单的等待工作队列之软件模型设计与实现(三)
- python自动化脚本安装指定版本的python环境
- Spring事务管理——事务的传播行为
- .NET之三分钟学会玩C#委托
- 编程题之——KMP算法Java实现
- HTTP中Get与Post的区别
- CodeForces
- 二维码扫描--基于bingoogolapple + Android Studio 2.3.3
- kotlin 底部导航栏(tabLayout + fragment)