设计一条简单的等待工作队列之软件模型设计与实现(三)

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);
}

如果后面的队列设计得更加复杂,可能考虑到队列会产生阻塞,休眠的结果,则到时候需要设计一个唤醒队列的机制,就需要进程间通信的知识支持了。

时间: 2024-08-01 10:31:23

设计一条简单的等待工作队列之软件模型设计与实现(三)的相关文章

需要时显示 设计不是简单就行而是不能复杂

近几年移动平台风生水起,APP多得数不胜数,交互方式也是遍地开花,相信大家都玩过那么几个让人惊艳的APP.大家看到的亮点或是转场够炫.或是拟物得恰到好处.又或是突破性的操作方式,但我认为"需要时显示"也是许多设计中的精妙之笔,是设计师应遵循的原则之一. 需要时显示 首先谈谈"需要时显示"这个概念,记忆中这句话有2个出处: Extras on Demand. -<Designing Interfaces> 摘抄:让80%的使用情形更容易,而剩下的20%至少

设计-简约而不简单

本文来自hxfirefox,他是笔者在某国内大型企业提供敏捷XP咨询项目的内部教练.本文也是由他交给笔者帮助review,同时也授权发布在笔者的博客中. 原文地址为:直接不等于简单. 码农的博弈 了解XP(极限编程)的人都知道,XP有一项实践叫做简单设计(simple design),站在这项实践对立面的是过度设计.当我们从客户价值的中心视角去审视那些我们遇到过的过度设计,自然而然就会得出一个结论: "又TM被那些美其名曰项目经理和程序员的孙子们给忽悠了,这些功能我其实都用不到,但我还花了这么多

素材公社,让设计变得简单

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 简单是设计的最高境界,创作一个漂亮的设计往往用最简单的表现形式就可以胜任,但简单并不代表容易,事实上,很多设计人员都走过一条从复杂到简单的风格路线,这说明设计简单的作品是需要经验积累的.素材公社结合100万设计师灵感,创作出让人过目不忘的效果! 素材公社网,创立于2008年,经历了近四年的褪变与发展,第九部落业已成为湖南省最新锐的网络信息公司

Twitter:一条简单的推文背后展示强大开源力量

摘要:7年前的一个创意,成就了如今风靡全世界的社交网络和微博客服务--Twitter.如今Twitter的月活跃用户数达到了2亿多,每天大约有5亿条推文被发送.这一切的背后,是由大量的开源项目在支撑. Twitter被称为"互联网的短信服务",允许用户发布不超过140个字的微博客,该创意来自Twitter的联合创始人Jack Dorsey,这个在7年前被分析师称为"有史以来最愚蠢"的创意,不料如今已经成为了风靡全世界的社交网络和微博客服务,月活跃用户达到了2.183

mysql-一条简单而又迷惑的MySql语句

问题描述 一条简单而又迷惑的MySql语句 有两个表person和ordersperson里存着顾客的名字name和身份证号id,orders里存着顾客的身份证号id.订单的oid和每笔订单所购的货物的清单list.如下person表 name id orders表id oid list SQL语句 select name(select count(*) from orders where orders.id=person.id) from person order by name;输出的结果正

安卓 sqlitw数据库设计 多条记录

问题描述 安卓 sqlitw数据库设计 多条记录 安卓 每一项活动有多人参与 记录参与人的姓名怎样设计数据库 可以使得根据人的名称来获取参与的所有记录更方便 解决方案 额..这个跟是不是安卓,以及是什么DB,应该没关系吧.1.活动表(活动id,xxxxxxx)2.人员表(人员id,xxxxxxxxx)3.活动参与 人员表(活动id,参与人id) 多对多的 查记录只要查"活动参与 人员表"就可以了,当然,数据量有可能会比较大,那么还有个方案2.1.不变2.不变3.活动参与人员表(活动id

一条很复杂的sql语句与n条简单的sql语句比,哪个效率高?

问题描述 都是在连接open以后提交语句,一条复杂语句就是操作全由数据库完成,多条简单点的语句是一部分工作由数据库完成,一部分由C#程序完成 解决方案 解决方案二:自己顶下,大神快来解决方案三:肯定是一条啊解决方案四:引用2楼lstcyzj的回复: 肯定是一条啊 如果是操作很复杂不会影响性能么解决方案五:多条简单点的语句其实就是把一些计算放在程序里做了,查询和更新用的sql语句解决方案六:自己顶下,,,,解决方案七:引用3楼newlovedew的回复: 如果是操作很复杂不会影响性能么 这真不能一

《SQL初学者指南(第2版)》——2.1 一条简单的SELECT语句

2.1 一条简单的SELECT语句 在SQL中,数据的检索可以通过SELECT语句来完成.无需太多解释,我们来看一条最简单的SELECT语句的示例: SELECT * FROM Customers 和所有的计算机语言一样,在SQL中,有些单词是关键字.这些单词有特殊的意义,而且必须以特定的方法来使用.在这条语句中,单词SELECT和FROM是关键字.关键字SELECT表示我们开始编写一条SELECT语句.关键字FROM用来表示从哪个表中检索数据,表名紧跟在FROM之后.在这个示例中,表名是Cus

病毒式营销的六条简单原则

我不得不承认,"病毒式营销"这个词儿有点儿攻击性.自诩为病毒式营销者的人会让人望而生畏.但是,我就喜欢.你也许会问"人们有对付它的疫苗么?".作为一种险恶的东西,小小的病毒命运多舛,半死不活,只有在灾难电影或者恐怖电影里才能见到,乏人问津. 但是你不得不崇拜病毒.他深居简出,直到纯粹靠数量赢得优势之后人们才意识到他庞大数目.他寄生在其他宿主身上,并利用宿主的资源繁衍自己的后代.在合适的环境中,他会呈指数级增长.病毒甚至不用搞对象--他仅仅靠复制,通过一次次的几何级增