设计一条简单的等待工作队列之软件模型设计与实现(三)
2017-09-02 18:59
281 查看
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);
}如果后面的队列设计得更加复杂,可能考虑到队列会产生阻塞,休眠的结果,则到时候需要设计一个唤醒队列的机制,就需要进程间通信的知识支持了。
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);
}如果后面的队列设计得更加复杂,可能考虑到队列会产生阻塞,休眠的结果,则到时候需要设计一个唤醒队列的机制,就需要进程间通信的知识支持了。
相关文章推荐
- 设计一条简单的等待工作队列之软件模型设计与实现(一)
- 设计一条简单的等待工作队列之软件模型设计与实现(二)
- C#实现一个简单的工作队列调度器
- Java语言实现简单FTP软件------>上传下载队列窗口的实现(七)
- C/S模型 多线程服务器实现简单计算工作并回馈客户端
- 简单易用的消息队列框架的设计与实现
- 8_14 日学到的新知识(简单的工厂模式的实现, MVC 模式的基本概念,软件工程中的四种开发模型, 以及软件工程中的一些小知识点)
- ThroughoutCMS技术共享系列(3):三维的权限抽象模型-PK访问控制设计的软件实现
- Java语言实现简单FTP软件 FTP上传下载队列窗口实现(7)
- Android Binder机制の设计与实现8-9(数据包接收队列与等待队列管理/总结)
- C#实现一个简单的工作队列调度器
- 软件设计模型之抽象工厂模式(Java实现)
- Java语言实现简单FTP软件------>上传下载队列窗口的实现(七)
- 多工作线程获取工作队列简单实现
- powerdesign设计、实现简单的数据库模型
- 用JSP+Servlet+JavaBean模式实现一个简单的登录网页设计(JSP+Tomcat+MySQL)
- Samba 文件服务器用户复杂权限模型设计和实现 v0.1b
- 基于RBAC模型的权限管理系统的设计和实现
- 应用框架的设计与实现——.NET平台(9 消息队列产品安装)
- 章五 软件体系结构集成开发环境的设计与实现