01 2012 档案

摘要:【IT168专稿】眼看2011年即将过去了,技术开发领域发生了翻天覆地的变化,掀起了一股新的技术狂潮。本文将分别围绕着 Java、.NET、Web开发、开源等领域,盘点整个2011年所取得的发展与成就。在Web开发领域,总离不开Java与.NET Framework两大阵营的角逐。提起Java,有一个绕不开的话题,那就是“地球上从此没有了Sun之后,新东家甲骨文到底能不能将Java发扬光大 呢?”答案是肯定的。本文将为您盘点甲骨文2011年的Java十大成就,看看数据库巨头是如何推动Java发展的。 说到关键字 “十”,不得不提到另一个与Java息息相关的工具,那就是Eclipse。Sun的. 阅读全文
posted @ 2012-01-30 12:35 董雨 阅读(236) 评论(0) 推荐(0)
摘要:参考:http://blog.csdn.net/codejoker/article/details/51883641.去下面的地址下载log4cpp1.0源码,http://sourceforge.net/projects/log4cpp/files/2.解压源码后发现log4cpp只提供了VC6.0的工程文件,在<msvc6>目录下。3.用VisualStudio2010打开vc6的工程,并进行转换。4.直接编译log4cppDLL项目,生成失败,提示如下:因为log4cpp在生成NTEventLogAppender.dll时,需要连接NTEventLogCategories.m 阅读全文
posted @ 2012-01-30 12:30 董雨 阅读(466) 评论(0) 推荐(0)
摘要:http://blog.csdn.net/liquanhai/article/details/7215045过年了,事情可以暂时放一下了。总结一下很有必要。又看到外面饭馆写着“岁末收工,初六开炉“了。好了,废话不多说,接着上篇继续评点程序员常用工具。当然还得请朋友们留言,好做继续的整理和补充,谢谢!顺祝大家新年好!文中已经提供每个工具的超链接地址,请点击下载:1. IDE:钟情于VC++6.0,但是也感觉Visual Studio2008和2010的强大,可能迟早得转到VS高版本上来。在安装VC++6.0的时候记得安装sp6补丁和msdn(MSDN_1.5_精简安装版)2. 辅助:(1)Vis 阅读全文
posted @ 2012-01-30 08:49 董雨 阅读(307) 评论(0) 推荐(0)
摘要:一直在想程序员们都喜欢装些什么东东到自己电脑上呢,你也许老是在不停地卸了装,装了卸。同一系列的到底哪一种最适合自己呢。且听木木点评。如果您觉得有些点评不合适或者需要补充,欢迎提出宝贵意见,O(∩_∩)O谢谢!转载请注明出处:http://blog.csdn.net/liquanhai/article/details/7203155 首先声明自己用的操作系统是windows系列,第一大类为系统必备软件的选择,第二大类是程序员专用软件的选择。本文是第一篇:1. 个人日记:ediary一个维护了10几年的软件,虽然历经了论坛博客微博时代,但是它仍旧存在着。存在的就是合理的,何况他已经变得那么好... 阅读全文
posted @ 2012-01-30 08:48 董雨 阅读(287) 评论(0) 推荐(0)
摘要:http://blog.csdn.net/hstar00004/article/details/7206354首先来说一个高级程序员并非靠自己读几本书写几万行代码就能练就的,我更关注于低层的环境,也就是程序员实实在在的工作环境。因为程序员的高低还得从实际的工作来衡量,而非其它。所以我想说的是,中国的软件公司的性质直接导致程序员的水平的高低。而我所说的软件公司,不是指某个或者某几个,而是指主流的软件公司,大众型的软件公司。所以我希望那些已经步入一个理想的公司的程序员理解我这篇文章的定位。软件公司的无偿加班对程序员的影响:国内的软件公司中程序员是常常加班的,每日加,周未也常加。基于这种性质,出现了 阅读全文
posted @ 2012-01-29 16:59 董雨 阅读(246) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 不知不觉当中,我们就到了最后一种设计模式,即访问者模式。访问者模式,听上去复杂一些。但是,这种模式用简单的一句话说,就是不同的人对不同的事物有不同的感觉。比如说吧,豆腐可以做成麻辣豆腐,也可以做成臭豆腐。可是,不同的地方的人未必都喜欢这两种豆腐。四川的朋友可能更喜欢辣豆腐,江浙的人就可能对臭豆腐更喜欢一些。那么,这种情况应该怎么用设计模式表达呢?[cpp] view plaincopyprint?typedefstruct_Tofu{inttype;void(*eat)(struct_Vi. 阅读全文
posted @ 2012-01-21 22:13 董雨 阅读(283) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 记得还在我们大学C++第一门课的时候,老师就告诉我们说,C++是一门面向对象的语言。C++有三个最重要的特点,即继承、封装、多态。等到后来随着编码的增多和工作经验的积累,我也慢慢明白了面向对象的含义。可是,等我工作以后,使用的编程语言更多的是C语言,这时候我又想能不能把C语言变成面向对象的语言呢?等到后来通过思考和实践,我发现其实C语言也是可以面向对象的,也是可以应用设计模式的,关键就在于如何实现面向对象语言的三个重要属性。(1)继承性[cpp] view plaincopyprint?t. 阅读全文
posted @ 2012-01-21 22:13 董雨 阅读(481) 评论(0) 推荐(1)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 命令模式的目的主要是为了把命令者和执行者分开。老规矩,举个范例吧。假设李老板是一家公司的头儿,他现在让他的秘书王小姐去送一封信。王小姐当然不会自己亲自把信送到目的地,她会把信交给邮局来完成整个投递的全过程。现在,我们就对投递者、命令、发令者分别作出定义。 首先定义post的相关数据。[cpp] view plaincopyprint?typedefstruct_Post{void(*do)(struct_Post*pPost);}Post;typedef struct _Post{ ... 阅读全文
posted @ 2012-01-21 22:12 董雨 阅读(303) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 状态模式是协议交互中使用得比较多的模式。比如说,在不同的协议中,都会存在启动、保持、中止等基本状态。那么怎么灵活地转变这些状态就是我们需要考虑的事情。假设现在有一个state,[cpp] view plaincopyprint?typdefstruct_State{void(*process)();struct_Sate*(*change_state)();}State;typdef struct _State{ void (*process)(); struct _Sate*... 阅读全文
posted @ 2012-01-21 22:12 董雨 阅读(839) 评论(1) 推荐(1)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 解释器模式虽然听上去有些费解,但是如果用示例说明一下就不难理解了。我们知道在C语言中,关于变量的定义是这样的:一个不以数字开始的由字母、数字和下划线构成的字符串。这种形式的表达式可以用状态自动机解决,当然也可以用解释器的方式解决。[cpp] view plaincopyprint?typedefstruct_Interpret{inttype;void*(*process)(void*pData,int*type,int*result);}Interpret;typedef struct.. 阅读全文
posted @ 2012-01-21 22:11 董雨 阅读(343) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 观察者模式可能是我们在软件开发中使用得比较多的一种设计模式。为什么这么说?大家可以听我一一到来。我们知道,在windows的软件中,所有的界都是由窗口构成的。对话框是窗口,菜单是窗口,工具栏也是窗口。那么这些窗口,在很多情况下要对一些共有的信息进行处理。比如说,窗口的放大,窗口的减小等等。面对这一情况,观察者模式就是不错的一个选择。 首先,我们可以对这些共有的object进行提炼。[cpp] view plaincopyprint?typedefstruct_Object{observe.. 阅读全文
posted @ 2012-01-21 22:10 董雨 阅读(886) 评论(0) 推荐(1)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 备忘录模式的起源来自于撤销的基本操作。有过word软件操作经验的朋友,应该基本上都使用过撤销的功能。举个例子,假设你不小心删除了好几个段落的文字,这时候你应该怎么办呢?其实要做的很简单,单击一些【撤销】就可以全部搞定了。撤销按钮给我们提供了一次反悔的机会。 既然是撤销,那么我们在进行某种动作的时候,就应该创建一个相应的撤销操作?这个撤销操作的相关定义可以是这样的。[cpp] view plaincopyprint?typedefstruct_Action{inttype;struct_A.. 阅读全文
posted @ 2012-01-21 22:10 董雨 阅读(269) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 在以往的软件开发过程中,我们总是强调模块之间要低耦合,模块本身要高内聚。那么,可以通过哪些设计模式来实现呢?桥接模式就是不错的一个选择。我们知道,在现实的软件开发过程当中,用户的要求是多种多样的。比如说,有这么一个饺子店吧。假设饺子店原来只卖肉馅的饺子,可是后来一些吃素的顾客说能不能做一些素的饺子。听到这些要求的老板自然不敢怠慢,所以也开始卖素饺子。之后,又有顾客提出,现在的肉馅饺子只有猪肉的,能不能做点牛肉、羊肉馅的饺子?一些只吃素的顾客也有意见了,他们建议能不能增加一些素馅饺子的品种,. 阅读全文
posted @ 2012-01-21 22:09 董雨 阅读(321) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 中介者模式,听上去有一点陌生。但是,只要我给朋友们打个比方就明白了。早先自由恋爱没有现在那么普遍的时候,男女之间的相识还是需要通过媒婆之间才能相互认识。男孩对女方有什么要求,可以通过媒婆向女方提出来;当然,女方有什么要求也可以通过媒婆向男方提出来。所以,中介者模式在我看来,就是媒婆模式。[cpp] view plaincopyprint?typedefstruct_Mediator{People*man;People*woman;}Mediator;typedef struct _Medi. 阅读全文
posted @ 2012-01-21 22:08 董雨 阅读(330) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 如果说前面的工厂模式是对接口进行抽象化处理,那么建造者模式更像是对流程本身的一种抽象化处理。这话怎么理解呢?大家可以听我慢慢到来。以前买电脑的时候,大家都喜欢自己组装机器。一方面可以满足自己的个性化需求,另外一方面也可以在价格上得到很多实惠。但是电脑是由很多部分组成的,每个厂家都只负责其中的一部分,而且相同的组件也有很多的品牌可以从中选择。这对于我们消费者来说当然非常有利,那么应该怎么设计呢?[cpp] view plaincopyprint?typedefstruct_AssembleP. 阅读全文
posted @ 2012-01-21 22:08 董雨 阅读(225) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 策略模式就是用统一的方法接口分别对不同类型的数据进行访问。比如说,现在我们想用pc看一部电影,此时应该怎么做呢?看电影嘛,当然需要各种播放电影的方法。rmvb要rmvb格式的方法,avi要avi的方法,mpeg要mpeg的方法。可是事实上,我们完全可以不去管是什么文件格式。因为播放器对所有的操作进行了抽象,不同的文件会自动调用相应的访问方法。[cpp] view plaincopyprint?typedefstruct_MoviePlay{struct_CommMoviePlay*pCom. 阅读全文
posted @ 2012-01-21 22:07 董雨 阅读(474) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 装饰模式是比较好玩,也比较有意义。其实就我个人看来,它和责任链还是蛮像的。只不过一个是比较判断,一个是迭代处理。装饰模式就是那种迭代处理的模式,关键在哪呢?我们可以看看数据结构。[cpp] view plaincopyprint?typedefstruct_Object{struct_Object*prev;void(*decorate)(struct_Object*pObject);}Object;typedef struct _Object{ struct _Object* pr... 阅读全文
posted @ 2012-01-21 22:05 董雨 阅读(300) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 现在的生活当中,我们离不开各种电子工具。什么笔记本电脑、手机、mp4啊,都离不开充电。既然是充电,那么就需要用到充电器。其实从根本上来说,充电器就是一个个普通的适配器。什么叫适配器呢,就是把220v、50hz的交流电压编程5~12v的直流电压。充电器就干了这么一件事情。 那么,这样的一个充电适配器,我们应该怎么用c++描述呢?[cpp] view plaincopyprint?classvoltage_12v{public:voltage_12v(){}virtual~voltage_12v 阅读全文
posted @ 2012-01-21 22:05 董雨 阅读(498) 评论(0) 推荐(0)
摘要:http://blog.csdn.net/feixiaoxing/article/details/7104338【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 享元模式看上去有点玄乎,但是其实也没有那么复杂。我们还是用示例说话。比如说,大家在使用电脑的使用应该少不了使用WORD软件。使用WORD呢, 那就少不了设置模板。什么模板呢,比如说标题的模板,正文的模板等等。这些模板呢,又包括很多的内容。哪些方面呢,比如说字体、标号、字距、行距、大小等 等。[cpp] view plaincopytypedefstruct_Font{inttyp. 阅读全文
posted @ 2012-01-18 12:29 董雨 阅读(340) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 代理模式是一种比较有意思的设计模式。它的基本思路也不复杂。举个例子来说,以前在学校上网的时候,并不是每一台pc都有上网的权限的。比如说,现在有pc1、pc2、pc3,但是只有pc1有上网权限,但是pc2、pc3也想上网,此时应该怎么办呢? 此时,我们需要做的就是在pc1上开启代理软件,同时把pc2、pc3的IE代理指向pc1即可。这个时候,如果pc2或者pc3想上网,那么报文会先指 向pc1,然后pc1把Internet传回的报文再发给pc2或者pc3。这样一个代理的过程就完成了整个的... 阅读全文
posted @ 2012-01-18 12:27 董雨 阅读(387) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 前面我们写过的工厂模式实际上是对产品的抽象。对于不同的用户需求,我们可以给予不同的产品,而且这些产品的接口都是一致的。而抽象工厂呢?顾名思义,就是说我们的工厂是不一定的。怎么理解呢,举个例子。 假设有两个水果店都在卖水果,都卖苹果和葡萄。其中一个水果店买白苹果和白葡萄,另外一个水果店卖红苹果和红葡萄。所以说,对于水果店而言,尽管都在卖水果,但是两个店卖的品种不一样。 既然水果不一样,那我们先定义水果。[cpp] view plaincopytypedefstruct_Apple{vo... 阅读全文
posted @ 2012-01-18 12:26 董雨 阅读(697) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 使用过C++的朋友大概对迭代器模式都不会太陌生。这主要是因为我们在编写代码的时候离不开迭代器,队列有迭代器,向量也有迭代器。那么,为什么要迭代器呢?这主要是为了提炼一种通用的数据访问方法。 比如说,现在有一个数据的容器,[cpp] view plaincopytypedefstruct_Container{int*pData;intsize;intlength;Interator*(*create_new_interator)(struct_Container*pContainer);... 阅读全文
posted @ 2012-01-18 12:26 董雨 阅读(266) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 外观模式是比较简单的模式。它的目的也是为了简单。什么意思呢?举个例子吧。以前,我们逛街的时候吃要到小吃一条街,购物要到购物一条街,看书、看电影要 到文化一条街。那么有没有这样的地方,既可以吃喝玩乐,同时相互又靠得比较近呢。其实,这就是悠闲广场,遍布全国的万达广场就是干了这么一件事。 首先,我们原来是怎么做的。[cpp] view plaincopytypedefstruct_FoodSteet{void(*eat)();}FoodStreet;voideat(){printf("e 阅读全文
posted @ 2012-01-18 12:26 董雨 阅读(226) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 工厂模式是比较简单,也是比较好用的一种方式。根本上说,工厂模式的目的就根据不同的要求输出不同的产品。比如说吧,有一个生产鞋子的工厂,它能生产皮鞋,也能生产胶鞋。如果用代码设计,应该怎么做呢?[cpp] view plaincopytypedefstruct_Shoe{inttype;void(*print_shoe)(struct_Shoe*);}Shoe; 就像上面说的,现在有胶鞋,那也有皮鞋,我们该怎么做呢?[cpp] view plaincopyvoidprint_leather... 阅读全文
posted @ 2012-01-18 12:25 董雨 阅读(401) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 责任链模式是很实用的一种实际方法。举个例子来说,我们平常在公司里面难免不了报销流程。但是,我们知道公司里面每一级的领导的报批额度是不一样的。比如说,科长的额度是1000元,部长是10000元,总经理是10万元。 那么这个时候,我们应该怎么设计呢?其实可以这么理解。比如说,有人来找领导报销费用了,那么领导可以自己先看看自己能不能报。如果费用可以顺利报下来当然最好,可是万一报不下来呢?那就只能请示领导的领导了。[cpp] view plaincopytypedefstruct_Leader{.. 阅读全文
posted @ 2012-01-18 12:25 董雨 阅读(522) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 模板对于学习C++的同学,其实并不陌生。函数有模板函数,类也有模板类。那么这个模板模式是个什么情况?我们可以思考一下,模板的本质是什么。比如说,现在我们需要编写一个简单的比较模板函数。[cpp] view plaincopytemplate<typenametype>intcompare(typea,typeb){returna>b?1:0;} 模板函数提示我们,只要比较的逻辑是确定的,那么不管是什么数据类型,都会得到一个相应的结果。固然,这个比较的流程比较简单,即使没有采 阅读全文
posted @ 2012-01-18 12:24 董雨 阅读(314) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 原型模式本质上说就是对当前数据进行复制。就像变戏法一样,一个鸽子变成了两个鸽子,两个鸽子变成了三个鸽子,就这么一直变下去。在变的过程中,我们不需要考虑具体的数据类型。为什么呢?因为不同的数据有自己的复制类型,而且每个复制函数都是虚函数。 用C++怎么编写呢,那就是先写一个基类,再编写一个子类。就是这么简单。[cpp] view plaincopyclassdata{public:data(){}virtual~data(){}virtualclassdata*copy()=0;};cl... 阅读全文
posted @ 2012-01-18 12:23 董雨 阅读(264) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 组合模式听说去很玄乎,其实也并不复杂。为什么?大家可以先想一下数据结构里面的二叉树是怎么回事。为什么就是这么一个简单的二叉树节点既可能是叶节点,也可能是父节点?[cpp] view plaincopytypedefstruct_NODE{void*pData;struct_NODE*left;struct_NODE*right;}NODE; 那什么时候是叶子节点,其实就是left、right为NULL的时候。那么如果它们不是NULL呢,那么很明显此时它们已经是父节点了。那么,我们的这个... 阅读全文
posted @ 2012-01-18 12:23 董雨 阅读(316) 评论(0) 推荐(0)
摘要:http://blog.csdn.net/feixiaoxing/article/details/7068053【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 关于软件设计方面的书很多,比如《重构》,比如《设计模式》。至于软件开发方式,那就更多了,什么极限编程、精益方法、敏捷方法。随着时间的推移,很多的方法又会被重新提出来。 其实,就我个人看来,不管什么方法都离不开人。一个人写不出二叉树,你怎么让他写?敏捷吗?你写一行,我写一行。还是迭代?写三行,删掉两行,再写三行。 项目的成功是偶然的,但是项目的失败却有很多原因,管理混乱、需求混... 阅读全文
posted @ 2012-01-18 12:22 董雨 阅读(291) 评论(0) 推荐(1)
摘要:http://blog.csdn.net/feixiaoxing/article/details/7071202【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 有过面试经验的朋友,或者对设计模式有点熟悉的朋友,都会对单件模式不陌生。对很多面试官而言,单件模式更是他们面试的保留项目。其实,我倒认为,单件模式算不上什么设计模式。最多也就是个技巧。 单件模式要是用C++写,一般这么写。 #include <string.h> #include <assert.h> class object { ... 阅读全文
posted @ 2012-01-18 12:22 董雨 阅读(376) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 定时器是我们需要经常处理的一种资源。那linux下面的定时器又是怎么一回事呢?其实,在linux里面有一种进程中信息传递的方法,那就是信号。这里的定时器就相当于系统每隔一段时间给进程发一个定时信号,我们所要做的就是定义一个信号处理函数。[cpp] view plaincopy#include<stdio.h>#include<time.h>#include<sys/time.h>#include<stdlib.h>#include<sig 阅读全文
posted @ 2012-01-18 12:19 董雨 阅读(277) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 在我们编写软件的过程当中,少不了需要使用别人的库函数。因为大家知道,软件是一个协作的工程。作为个人来讲,你不可能一个人完成所有的工作。另外,网络上一些优秀的开源库已经被业内广泛接受,我们也没有必要把时间浪费在这些重复的工作上面。 既然说到了库函数,那么一般来说库函数分为两种方式:静态库和动态库。两者的区别其实很小,静态库是必须要链接到执行文件中去的,而动态库是不需要链接到 最后的执行文件中的。怎么理解呢?也就是说,对于最后的执行文件而言,你是否删除静态库无所谓。但是,一旦你删除了动态库... 阅读全文
posted @ 2012-01-18 12:18 董雨 阅读(232) 评论(1) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 动态链接库不是linux独有的特性,在windows下面也存在这样的特性。一般来说,windows下面的动态连接库是以*.dll作为结尾的,而 linux下面的动态连接库是以*.so结尾的。和静态链接库相比,动态连接库可以共享内存资源,这样可以减少内存消耗。另外,动态连接是需要经过操作系 统加载器的帮助才能被普通执行文件发现的,所以动态连接库可以减少链接的次数。有了这个特点,我们就不难发现为什么很多软件的补丁其实都是以动态库发布 的。 那么,在Linux上动态库是怎么生成的呢?[cpp... 阅读全文
posted @ 2012-01-18 12:18 董雨 阅读(239) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 编写代码过程中少不了调试。在windows下面,我们有visual studio工具。在linux下面呢,实际上除了gdb工具之外,你没有别的选择。那么,怎么用gdb进行调试呢?我们可以一步一步来试试看。[cpp] view plaincopy#include<stdio.h>intiterate(intvalue){if(1==value)return1;returniterate(value-1)+value;}intmain(){printf("%d\n" 阅读全文
posted @ 2012-01-18 12:17 董雨 阅读(257) 评论(1) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 同样是x86的cpu,但是却可以用不同形式的汇编语言来表示。在window上面我们使用的更多是intel格式的汇编语言,而在Linux系统上面使 用的更多的常常是AT&T格式的汇编语言。那什么是AT&T格式的汇编代码呢?我们可以写一个试试看。[cpp] view plaincopy.datamessage:.string"hello!\n"length=.-message.text.global_start_start:movl$length,%edxmo 阅读全文
posted @ 2012-01-18 12:17 董雨 阅读(177) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 对于程序设计员来说,makefile是我们绕不过去的一个坎。可能对于习惯Visual C++的用户来说,是否会编写makefile无所谓。毕竟工具本身已经帮我们做好了全部的编译流程。但是在Linux上面,一切变得不一样了,没有人会 为你做这一切。编代码要靠你,测试要靠你,最后自动化编译设计也要靠你自己。想想看,如果你下载了一个开源软件,却因为自动化编译失败,那将会在很大程度 上打击你学习代码的自信心了。所以,我的理解是这样的。我们要学会编写makefile,至少会编写最简单的makef... 阅读全文
posted @ 2012-01-18 12:14 董雨 阅读(261) 评论(0) 推荐(0)
摘要:http://blog.csdn.net/feixiaoxing/article/details/7194756#comments【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 在很多人的眼里,C语言和linux常常是分不开的。这其中的原因很多,其中最重要的一部分我认为是linux本身就是C语言的杰出作品。当 然,linux操作系统本身对C语言的支持也是相当到位的。作为一个真正的程序员来说,如果没有在linux下面用C语言编写过完整的程序,那么只能说他 对C语言本身的理解还相关肤浅,对系统本身的认识也不够到位。作为程序员来说,lin... 阅读全文
posted @ 2012-01-18 12:13 董雨 阅读(229) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 在算术符重载里面,“=”重载可能是最经常使用的一种。但是好多人就误以为在函数中,凡是类出现“=”的地方,那就是调用算术符重载,其实不然。为什么呢?我们可以看看下面的代码。首先,我们定义一个基本类:[cpp] view plaincopyclassdata{char*value;intnumber;public:explicitdata(intnum=0){if(num){number=num;value=(char*)malloc(num);}}data(constdata&d){n 阅读全文
posted @ 2012-01-18 11:16 董雨 阅读(164) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 指针是编程人员的梦魇,对C语言的开发者是如此,对C++的开发者也是如此。特别是在C++中,如果不注意处理类中的指针,非常容易出问题。如果朋友们不相信可以看看下面的代码:[cpp] view plaincopyclassdata{int*value;public:data(intnum){if(num>0)value=(int*)malloc(sizeof(int)*num);}~data(){if(value)free(value);}};voidprocess(){datam(10) 阅读全文
posted @ 2012-01-18 11:15 董雨 阅读(165) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 泛型编程其实不难。本质上说,泛型编程就是让通用的算法应用到所有的数据类型。具体来说,int是我们熟悉的整数类型。那么一般情况下,如果我们写一个int整数的排序算法,应该怎么写呢?大家可以自己试试?下面的代码是我的一个范例;[cpp] view plaincopyvoidbubble_sort(intarray[],intlength){inttemp=0;intouter=0;intinner=0;assert(NULL!=array&&0!=length);for(oute 阅读全文
posted @ 2012-01-18 11:14 董雨 阅读(199) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 有过C语言编程的朋友大多知道,如果在malloc内存之后不及时free掉内存,那么很有可能会造成内存泄露的。那么在C++上面,是不是也存在这样 的问题呢?结果是C++上面同样也存在内存泄露的危险。这个危险就是如果new后面不能delete的话,也会造成内存的泄露。还有不清楚的朋友可以看看 下面的示例:[cpp] view plaincopyclasstest{intdata;public:test(intvalue):data(value){}~test(){};};voidprocess( 阅读全文
posted @ 2012-01-18 11:14 董雨 阅读(231) 评论(0) 推荐(1)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 缺省函数是C++的一个基本特色。缺省函数定义比较简单,也就是说,对于函数的某一个输入参数或者几个输入参数,如果你没有特定的数值的话,那我们就会 用缺省的数据进行代替。如果你在调用的过程中使用了自己的数据,那么缺省数据将被我们自己定义的数据覆盖。下面就是一个缺省函数的示例:[cpp] view plaincopyintadd(intm,intn=10){returnm+n;} 如果调用呢,有什么区别?[cpp] view plaincopy262:intp=add(2);00401488pu. 阅读全文
posted @ 2012-01-18 11:13 董雨 阅读(296) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 递归,相信有过基本C语言经验的朋友都明白,就是函数自己调用自己。所以,本质上说,它和普通的函数调用没有什么区别。今天之所以会把模板类和递归联系在一起,是因为我们可以用递归的方法实现模板的递归。闲话不多说,我们先从一个统计函数开始说起。[cpp] view plaincopyintprocess(intm){intindex=0;intcount=0;assert(m>=0);for(;index<=m;index++){count+=index;}returncount;} 上面 阅读全文
posted @ 2012-01-18 11:13 董雨 阅读(234) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 如果类是一种确定的数据类型,那么模板就是一种对类的抽象。假设有这么一种类,它需要进行数据的计算,而且类型还很多,那么我们可能就要针对不同类型的数据定义不同的类。我们可以用下面一段代码说明问题:[cpp] view plaincopyclassint_process{inta;intb;public:int_process(intm,intn):a(m),b(n){}~int_process(){}intadd(){returna+b;}intsub(){returna-b;}intmul() 阅读全文
posted @ 2012-01-18 11:12 董雨 阅读(182) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 如果说模板类定义的是一种数据类型,那么模板函数定义的就是一种函数。既然是函数,那么就有输入数据和输出数据。和模板类的概念差不多,模板函数的初衷也是为了在函数操作上抽取共同的特性,屏蔽的是类型的不同和差异。我们可以通过下面一个简单的代码说明问题:[cpp] view plaincopyintint_compare(inta,intb){returna>b?a:b;}doubledouble_compare(doublea,doubleb){returna>b?a:b;} 上面的一段 阅读全文
posted @ 2012-01-18 11:12 董雨 阅读(181) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 算术符重载是类的有一个特性,但是每个人使用的方法不一样。用的好,则事半功倍;但是如果不正确的使用,则会后患无穷。 (1) 简单算术符介绍 那什么是算术符重载呢?我们可以举个例子。一般来说,我们定义两个int类型的变量的话,我们就可应对这两个类型进行加、减、乘、除的操作,同时还能比 较判断、打印、数组操作、*号操作等等。那么如果我们想自己定义的类也具有这样的属性,那我们应该怎么办呢?当然就要算术符重载了。首先,我们对基本 class做一个定义:[cpp] view plaincopyclass 阅读全文
posted @ 2012-01-18 11:11 董雨 阅读(182) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 const是C/C++语言中的关键字,但是如果用的好,可以极大地提高代码的健壮性。一般来说const使用的地方还是蛮多的,但是主要还是下面几个 地方:(1)普通变量的保护;(2)地址空间的保护;(3)类初始变量的声明和保护;(4)类变量在函数中的保护。const的保护主要来自于编译器层 面,和程序的运行没有关系。 (1)普通变量的保护[cpp] view plaincopyconstintdata=10;constcharstr='a';constdoublepi=3.14; 阅读全文
posted @ 2012-01-18 11:11 董雨 阅读(188) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 看过设计模式的朋友都知道,我们在设计单件模式的时候离不开类的静态函数。和类的成员变量不同,类的静态变量属于全部类对象数据;同样和类的成员函数不 同,类的静态函数属于全部类函数共有。这句话读来想来有一些拗口,不过没有关系,我们可以通过一段代码来说明问题。 (1)静态变量 老规矩,我们首先对类进行初步定义,如下所示:[cpp] view plaincopyclassemployee{public:employee(){}~employee(){}staticintvalue;}; 那么,这里出现 阅读全文
posted @ 2012-01-18 11:10 董雨 阅读(295) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 虚函数是面向对象设计中的一个重要内容。它的出现使得我们只需要相同的接口函数,并可以得到不同的生成结果。但是有些朋友却知其然,不知其所以然,为什 么会出现这样的结果,我们可以用一段代码说明问题。首先,我们先定义两个基本类型,一个是employee,一个是manager,看过前面一片博客的朋 友应该都有点印象:[cpp] view plaincopyclassemployee{public:employee(){}~employee(){}virtualvoidprint()const{pri. 阅读全文
posted @ 2012-01-17 10:00 董雨 阅读(197) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 拷贝构造函数和复制函数是类里面比较重要的两个函数。两者有什么区别呢?其实也很简单,我们可以举个例子,加入有这样一个类的定义:[cpp] view plaincopyclassapple{public:apple(){printf("apple()!\n");}apple(apple&a){printf("copyapple()!\n");}apple&operator=(apple&a){printf("=apple( 阅读全文
posted @ 2012-01-17 09:59 董雨 阅读(211) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 继承是类的一个基本属性,可是在类的继承过程中,函数是怎么初始化?怎么析构的呢?我们不妨看看下面这样的一段代码?[cpp] view plaincopyclassemployee{public:employee(){printf("employee()!\n");}~employee(){printf("~employee()!\n");}};classmanager:publicemployee{public:manager(){printf(&quo 阅读全文
posted @ 2012-01-17 09:59 董雨 阅读(212) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 这里说的函数主要指的是inline函数、static函数。inline函数比较特殊,它既具有宏的性质,同时也能让编译器对它进行函数检查。 static函数同样也比较特殊,它只可以被同文件的函数使用。如果static函数在include文件中,那么这个头文件只要被使用一次,那么这个函 数就要在exec文件中重新出现一次。现在大家可能理解起来有点困难,但是请大家稍微等待一下,下面我们将会用示例进行说明。最后,我们用一个替换的技巧 对函数指针进行修改,让你调用的函数发生修改,这样给大家都函数... 阅读全文
posted @ 2012-01-17 09:58 董雨 阅读(190) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 前面我们讨论基本上都是C语言的内容,还没有真正触及到C++的相关知识。从这篇博客之后,我们将会更多触及类的内容。类的属性很多,今天我们讨论主要就是构造函数、析构函数。 (1)如果没有构造函数、析构函数呢?[cpp] view plaincopyclassapple{public:voidprint()const{return;}}; 虽然这个类没有什么意义,但是如果用sizeof计算一下大小的话,我们发现它还是占了一个字节。那么如果有一个apple的变量呢?为了让apple的变量有意义,.. 阅读全文
posted @ 2012-01-17 09:58 董雨 阅读(231) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 嵌入式汇编是对纯汇编文件的一种有益补充。通常会有下面几种情况使用到汇编:(1)提高代码的工作效率 ,使用到cpu的一些特殊指令,比如说mmx指令;(2)对硬件进行某种特殊的操作,比如说关中断等,这在内核级的代码中是比较常见的。但是我们讲究嵌入 式汇编的一些基本点和大家一起讨论一下,建议大家和我一起做实验,用事实证明一切。 (1)使用嵌入汇编的时候,注意寄存器的保护[cpp] view plaincopyintprocess(){__asm{pushaxpushbxpushcxpopcxp.. 阅读全文
posted @ 2012-01-17 09:57 董雨 阅读(244) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 循环是我们编程中遇到的另外一项重要技术。通过反复的迭代运算,我们可以获取想要的任何结果。当然这种迭代是有基本条件的,或是以时间为条件的,或是以 空间为条件的,或者是某一种外来交互作为条件的。循环的方式有很多种,但是常用的还是:while、for、do-while、goto这几种。很多公司 的项目都不喜欢goto,这其中倒不是说goto不好,主要是goto的随意性太大,一旦用的不好,就会降低代码的可读性,反而影响其他人的工作效率。 (1)do-while为什么先执行,后判断? 老规矩,我们还是 阅读全文
posted @ 2012-01-17 09:56 董雨 阅读(191) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 无论是在判断还是在循环的过程中,通常在遇到合适的条件的时候就会退出相应的模块。跳出模块运行的方式很多,break,continue,return都可以。下面我们就可以分别对他们进行将介绍。 (1)continue只能用于循环,而break循环、判断都可以应用。两者有什么区别呢?[cpp] view plaincopy21:for(intm=10;m<100;m++)00401638movdwordptr[ebp-4],0Ah0040163Fjmpprocess+2Ah(0040164a 阅读全文
posted @ 2012-01-17 09:56 董雨 阅读(194) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 (4)指针和引用 引用是C++和语言的区别之一。其实本质上说两者是一致的。朋友们可以看下面两段代码。 a)指针和指针的函数代码[cpp] view plaincopyvoidadd_point(int*q){(*q)++;}voidadd_ref(int&q){q++;} b)函数的调用代码[cpp] view plaincopy56:intm=10;004012E8movdwordptr[ebp-4],0Ah57:add_point(&m);004012EFleaeax,[ 阅读全文
posted @ 2012-01-17 09:55 董雨 阅读(233) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 在我们平常的编程当中,用于判断的地方很多,但主要有下面三种方式:if-else;switch;?:。其中最后一种方式在本质上和if-else是 一样的。switch和if-else其实也一样,如果我们把switch改成if(...) {} else if(...) {} else {},那么你实现的效果和switch实际差不多,熟悉的朋友都会有这样的体验。或许有的朋友还是不太相信,大家可以自己用写实例比较看一下。 (1) switch中的break重要吗?[cpp] view plainco 阅读全文
posted @ 2012-01-17 09:55 董雨 阅读(170) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 指针是我们在C/C++中经常遇到的一种数据类型。指针用的好,可以提高代码的可读性;但是如果使用不恰当,反而会造成很大的麻烦。指针,也就是指向某一 种数据类型的地址。这种类型很多,它可以是编程语言自带的类型,比如说int、long、short、char、float、double、int;也可 是是指向某一种自定义数据类型,可以使union、struct或者是class;甚至指向的数据类型本身即是指针,比如说int*、char*、 short**;当然指针还可以是指向一片内存,表示具有一定长度的 阅读全文
posted @ 2012-01-17 09:54 董雨 阅读(204) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 说到用汇编的眼光看C++语言,那么怎么阅读汇编代码就成了我们需要解决的一个问题。其实,实话说,汇编其实不难。只是我们需要明白这样几个问题: (1)汇编是什么语言? (2)汇编中的主要内容有哪些? (3)汇编语言是怎么和实际C/C++语言代码一一对应的? (1)汇编是什么语言 其实汇编语言是CPU指令码的一种标记符号。不同的CPU具有不同的指令集,普通PC上的CPU一般来自AMD或者是INTEL,使用的也就是我们今天 所要说的X86指令集。其他类似的CPU还有POWERPC,主要来自电信企业的 阅读全文
posted @ 2012-01-17 09:53 董雨 阅读(249) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 很多朋友,包括我自己在内,对C++语言的很多特性不是很明白。特别是几年前找工作的时候,为了应付来自工作单位的考试,我经常逼着自己的去记住一些复 杂的试题和答案。可是常常时间已过,一切又回到了原点。原来没有弄清楚的问题还是没有弄明白,一切都没有发生改变。直到若干年后,当我在编码过程中不断积 累经验,尝试用汇编代码和内存数据来解释一些现象的时候,才明白有些东西其实并不复杂。也许有的朋友对汇编语言会有畏惧,其实没有必要。只要你对C语言有 一些基础,对堆栈有一些印象,那么你已经拥有汇编语言的基础.. 阅读全文
posted @ 2012-01-17 09:52 董雨 阅读(206) 评论(0) 推荐(0)
摘要:http://blog.csdn.net/feixiaoxing/article/details/6998116【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 早在八月份的时候,就陆陆续续写了二十多篇用汇编语言看C++的博客内容。在此为了做一个概括,也为了朋友们看起来更方便,我们利用这么一篇博客对所有的文章做一个总结。如果有朋友们在观看的过程当中发现了问题,恳请多多指教,谢谢。 01)用汇编的眼光看C++(开篇) 02)用汇编的眼光看C++(之X86汇编) 03)用汇编的眼光看C++(之指针1,2) 04)用汇编的眼光看C++(之判断流程 阅读全文
posted @ 2012-01-17 09:51 董雨 阅读(196) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 多线程编程是现代软件技术中很重要的一个环节。要弄懂多线程,这就要牵涉到多进程?当然,要了解到多进程,就要涉及到操作系统。不过大家也不要紧张,听我慢慢道来。这其中的环节其实并不复杂。 (1)单CPU下的多线程 在没有出现多核CPU之前,我们的计算资源是唯一的。如果系统中有多个任务要处理的话,那么就需要按照某种规则依次调度这些任务进行处理。什么规则呢?可以是一些简单的调度方法,比如说 1)按照优先级调度 2)按照FIFO调度 3)按照时间片调度等等 当然,除了CPU资源之外,系统中还有一些其.. 阅读全文
posted @ 2012-01-17 09:49 董雨 阅读(209) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 多线程创建其实十分简单,在windows系统下面有很多函数可以创建多线程,比如说_beginthread。我们就可以利用它为我们编写一段简单的多线程代码,[cpp] view plaincopy#include<windows.h>#include<process.h>#include<stdio.h>unsignedintvalue=0;voidprint(void*argv){while(1){printf("&value=%x,va 阅读全文
posted @ 2012-01-17 09:48 董雨 阅读(166) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 相信有过多线程编程经验的朋友,都吃过死锁的苦。除非你不使用多线程,否则死锁的可能性会一直存在。为什么会出现死锁呢?我想原因主要有下面几个方面: (1)个人使用锁的经验差异 (2)模块使用锁的差异 (3)版本之间的差异 (4)分支之间的差异 (5)修改代码和重构代码带来的差异 不管什么原因,死锁的危机都是存在的。那么,通常出现的死锁都有哪些呢?我们可以一个一个看过来, (1)忘记释放锁[cpp] view plaincopyvoiddata_process(){EnterCr... 阅读全文
posted @ 2012-01-17 09:48 董雨 阅读(230) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 在多线程存在的环境中,除了堆栈中的临时数据之外,所有的数据都是共享的。如果我们需要线程之间正确地运行,那么务必需要保证公共数据的执行和计算是正确 的。简单一点说,就是保证数据在执行的时候必须是互斥的。否则,如果两个或者多个线程在同一时刻对数据进行了操作,那么后果是不可想象的。 也许有的朋友会说,不光数据需要保护,代码也需要保护。提出这个观点的朋友只看到了数据访问互斥的表象。在程序的运行空间里面,什么最重要的呢?代码吗?当然不是。代码只是为了数据的访问存在的。数据才是我们一切工作的出发点和落脚 阅读全文
posted @ 2012-01-17 09:47 董雨 阅读(238) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 在windows系统中,系统本身为我们提供了很多锁。通过这些锁的使用,一方面可以加强我们对锁的认识,另外一方面可以提高代码的性能和健壮性。常用的锁以下四种:临界区,互斥量,信号量,event。 (1)临界区 临界区是最简单的一种锁。基本的临界区操作有,[cpp] view plaincopyInitializeCriticalSectionEnterCriticalSectionLeaveCriticalSectionDeleteCriticalSection 如果想要对数据进行互斥... 阅读全文
posted @ 2012-01-17 09:46 董雨 阅读(203) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 自旋锁是SMP中经常使用到的一个锁。所谓的smp,就是对称多处理器的意思。在工业用的pcb板上面,特别是服务器上面,一个pcb板有多个cpu是 很正常的事情。这些cpu相互之间是独立运行的,每一个cpu均有自己的调度队列。然而,这些cpu在内存空间上是共享的。举个例子说,假设有一个数据 value = 10,那么这个数据可以被所有的cpu访问。这就是共享内存的本质意义。 我们可以看一段Linux 下的的自旋锁代码(kernel 2.6.23,asm-i386/spinlock.h),就可.. 阅读全文
posted @ 2012-01-17 09:46 董雨 阅读(236) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 编写程序不容易,编写多线程的程序更不容易。相信编写过多线程的程序都应该有这样的一个痛苦过程,什么样的情况呢?朋友们应该看一下代码就明白了,[cpp] view plaincopyvoiddata_process(){EnterCriticalSection();if(/*errorhappens*/){LeaveCriticalSection();return;}if(/*othererrorhappens*/){return;}LeaveCriticalSection();} 上面的代码说 阅读全文
posted @ 2012-01-17 09:45 董雨 阅读(277) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 嵌套锁这个概念,主要是为了根据编程中的一种情形引申出来的。什么情况呢,我们可以具体说明一下。假设你在处理一个公共函数的时候,因为中间涉及公共数 据,所以你加了一个锁。但是,有一点比较悲哀。这个公共函数自身也加了一个锁,而且和你加的锁是一样的。所以,除非你的使用的是信号量,要不然你的程序一 辈子也获取不了这个锁。[cpp] view plaincopyHANDLEhLock;voidsub_func(){/*...*/WaitForSingleObject(hLock,INFINITE);d. 阅读全文
posted @ 2012-01-17 09:43 董雨 阅读(335) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 在编写多线程的时候,有一种情况是十分常见的。那就是,有些公共数据修改的机会比较少。相比较改写,它们读的机会反而高的多。通常而言,在读的过程中, 往往伴随着查找的操作,中间耗时很长。给这种代码段加锁,会极大地降低我们程序的效率。那么有没有一种方法,可以专门处理这种多读少写的情况呢? 有,那就是读写锁。 (1)首先,我们定义一下基本的数据结构。[cpp] view plaincopytypedefstruct_RWLock{intcount;intstate;HANDLEhRead;HA... 阅读全文
posted @ 2012-01-17 09:43 董雨 阅读(201) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 生产者-消费者是很有意思的一种算法。它的存在主要是两个目的,第一就是满足生产者对资源的不断创造;第二就是满足消费者对资源的不断索取。当然,因为空间是有限的,所以资源既不能无限存储,也不能无限索取。 生产者的算法,[cpp] view plaincopyWaitForSingleObject(hEmpty,INFINITE);WaitForSingleObject(hMutex,INIFINITE);/*producenewresources*/ReleaseMutex(hMutex);... 阅读全文
posted @ 2012-01-17 09:42 董雨 阅读(208) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 预防死锁的注意事项:(1)在编写多线程程序之前,首先编写正确的程序,然后再移植到多线程(2)时刻检查自己写的程序有没有在跳出时忘记释放锁(3)如果自己的模块可能重复使用一个锁,建议使用嵌套锁(4)对于某些锁代码,不要临时重新编写,建议使用库里面的锁,或者自己曾经编写的锁(5)如果某项业务需要获取多个锁,必须保证锁的按某种顺序获取,否则必定死锁(6)编写简单的测试用例,验证有没有死锁(7)编写验证死锁的程序,从源头避免死锁 首先,定义基本的数据结构和宏,[cpp] view plaincopy 阅读全文
posted @ 2012-01-17 09:41 董雨 阅读(244) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 对于编写多线程的朋友来说,队列具有天生的互斥性。在队列里面,一个负责添加数据,一个负责处理数据。谁也不妨碍谁,谁也离不开谁。所以,队列具有天生的并行性。[cpp] view plaincopy#defineMAX_NUMBER1000L#defineSTATUSint#defineOK0#defineFALSE-1typedefstruct_QUEUE_DATA{intdata[MAX_NUMBER];inthead;inttail;}QUEUE_DATA; 此时,一个线程压入数据,操作为p 阅读全文
posted @ 2012-01-17 09:40 董雨 阅读(280) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 软件调试是我们软件开发过程中的重要一课。在前面,我们也讨论过程序调试,比如说这里。今天,我们还可以就软件调试多讲一些内容。比如说条件断点,数据断点,多线程断点等等。[cpp] view plaincopy#include<stdio.h>intvalue=0;voidtest(){inttotal;intindex;total=0;for(index=0;index<100;index++)total+=index*index;value=total;return;}int 阅读全文
posted @ 2012-01-17 09:40 董雨 阅读(214) 评论(0) 推荐(0)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 在互斥数据访问中有一种多读少写的情况。正对这么一种情形,我们也提出了读写锁的方案。但是呢,这个锁有些缺陷。什么缺陷呢?那就是,这个写锁需要在所有的读锁完成之后才能写。否则的话,写锁需要这么一直等下去。 那么,有没有什么办法能使得写操作快速一点进行呢?那就是顺序锁。[cpp] view plaincopytypedefstruct_SEQUENCE_LOCK{unsignedintsequence;HANDLEhLock;}SEQUENCE_LOCK; 有了这么一个数据结构之后。那么读锁怎么. 阅读全文
posted @ 2012-01-17 09:39 董雨 阅读(231) 评论(0) 推荐(0)
摘要:http://blog.csdn.net/feixiaoxing/article/details/7055128【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 前面,为了使得写操作快速进行,我们定义了顺序锁。但是顺序锁有个缺点,那就是处理的数据不能是指针,否则可能会导致exception。那么有没有办法使得处理的数据包括指针呢?当然要是这个链表没有锁,那就更好了。 针对这种无锁链表,我们可以初步分析一下,应该怎么设计呢? (1)读操作没有锁,那么怎么判断读操作正在进行呢,只能靠标志位了; (2)写操作没有锁,那么读操作只能一个线... 阅读全文
posted @ 2012-01-17 09:37 董雨 阅读(508) 评论(0) 推荐(0)
摘要:http://blog.csdn.net/feixiaoxing/article/details/7058393【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 要想编写多线程,那就要使用锁。而在软件编写中,数据结构是少不了的。所以,我们在编写多线程的时候,就需要考虑一下如何在数据结构中插入锁。当然,有些数据结构是没有锁的,所以自然这个锁并不一定是必须的。 比如说,我们编写一个多线程堆栈,应该怎么做呢,[cpp] view plaincopytypedefstruct_STACK{void*pData;intmaxLen;inttop... 阅读全文
posted @ 2012-01-17 09:36 董雨 阅读(263) 评论(0) 推荐(0)
摘要:http://blog.csdn.net/feixiaoxing/article/details/7060751【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 多核编程并不是最近才兴起的新鲜事物。早在intel发布双核cpu之前,多核编程已经在业内存在了,只不过那时候是多处理器编程而已。为了实现多核编 程,人们开发实现了几种多核编程的标准。open-mp就是其中的一种。对于open-mp还不太熟悉的朋友,可以参照维基百科的相关解释。 open-mp的格式非常简单,原理也不难。它的基本原理就是创建多个线程,操作系统把这几个线程分到几个核.. 阅读全文
posted @ 2012-01-16 09:22 董雨 阅读(237) 评论(0) 推荐(0)
摘要:http://blog.csdn.net/feixiaoxing/article/details/7064559【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 多线程一直是我比较喜欢的话题,当然也是很多朋友比较害怕的话题。喜欢它,因为它确实可以提高pc的使用效率;讨厌它,因为如果对它处理不好,反而会导致更大的麻烦。这里断断续续写了这么多,没有什么新意,主要是想结合自己这么多年的个人经历谈一谈自己的想法而已。真心希望这些文章能够达到抛砖引玉的效果,更多的达人可以奉献出自己的经验和方法。谢谢。 (01)多线程的哪些儿事(优先级反转) (... 阅读全文
posted @ 2012-01-16 09:21 董雨 阅读(297) 评论(0) 推荐(0)
摘要:http://blog.csdn.net/feixiaoxing/article/details/7061582【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 优先级反转对于编写应用层的人员来说不大会发生,但是对于操作系统的设计者来说确是一个逃不过去的问题。要知道怎么样处理优先级反转?那么先看看它是怎么发生的。 (1)调度队列和线程优先级 在操作系统中,线程的状态有很多种。比如说,线程的状态可能是suspend、block、ready、die几种类型。我们把所有的ready线程放在一个队列里面,这就构成了一个基本的调度队列。 ... 阅读全文
posted @ 2012-01-16 09:21 董雨 阅读(225) 评论(0) 推荐(0)
摘要:http://www.cnblogs.com/zhaoxb/archive/2009/09/11/1564997.html这两天看了WebCast上的一节关于生成验证码的课程,觉得不错,自己动手做了一遍,修改了部分代码,现拿出来大家分享一下:Silverlight中生成验证码一般有三种方式,以下分别介绍。准备工作:新建一个Silverlight应用程序项目。在MainPage.xaml中加入三个image控件和三个button控件,用来测试三种方式生产的验证码,代码如下<StackPanel> <Image x:Name="source1" Stretch 阅读全文
posted @ 2012-01-16 09:12 董雨 阅读(578) 评论(1) 推荐(0)
摘要:使用TFS的时候经常默认登录一个账户,如果想切换用户用如下方法:Win2003:控制面板--->存储的用户名和密码--->选择TFS服务器地址,编辑其属性Win7:控制面板--->用户账户-->凭据管理器-->Windows凭据[修改掉连接到TFS服务的账户即可] 阅读全文
posted @ 2012-01-10 16:10 董雨 阅读(657) 评论(0) 推荐(0)
摘要:问题描述:使用webclient 下载除了xap下以外的dll文件,实现silverlight动态加载插件功能,在vs2010上调试好使,但是部署到IIS上,出现问题,提示NOT FOUNT 相关文件解决办法:首先在浏览器中输入http://0.0.0.0/ClientBin/xxx.dll 如果能下载就没问题,webclient方法可以使用,否则,在IIS中将web应用程序的执行权限改为纯脚本。 注:dll文件放在ClientBin目录下,不能放在服务器上的bin目录下。 阅读全文
posted @ 2012-01-10 14:18 董雨 阅读(327) 评论(0) 推荐(0)
摘要:http://www.cnblogs.com/beginor/archive/2011/08/11/2130109.html突破 Silverlight 自身限制, 做更好的动态加载导航机制(一)Silverlight 对反射的限制在 Silverlight 中, 对反射做了很多的限制, 最大的两个限制是:只能通过反射访问 public 成员, 无法访问其它 (private, protected, internal) 成员: 这一点,暂时没有什么好的解决方案。无法获取程序集的引用信息: 这一点, 幸好有 Mono.Cecil , 可以通过 Mono.Cecil 绕过 Silverlight 阅读全文
posted @ 2012-01-10 14:12 董雨 阅读(246) 评论(0) 推荐(0)
摘要:silverlight上传文件silverlight不支持本地文件创建等相关操作,上传文件时可以先把文件读入字节数组,然后调用web服务实现上传。 具体实现如下: silverlight端代码:private void button1_Click(object sender, RoutedEventArgs e) { OpenFileDialog dialog = new OpenFileDialog(); if (dialog.ShowDialog().Value) { // 选择上传的文件 FileInfo file = dialog.File; var fileName = dialog 阅读全文
posted @ 2012-01-10 09:38 董雨 阅读(230) 评论(0) 推荐(0)
摘要:http://webservices.ctocio.com.cn/net/387/9034887.shtml本文介绍ASP.NET中WCF服务与ASMX服务的兼容性,在ASP.NET应用程序中,目前主要存在两种软件技术可以用来构建服务,即ASMX Web服务和WCF服务。 WCF服务与ASMX服务的兼容性 根据前面的操作得知,当为ASP.NET AJAX程序创建一个新的WCF服务时,默认情况下该服务类前面使用AspNetCompatibilityRequirements属性进行修饰。现在,我们来作一下简要分析。[ServiceContract] [AspNetCompatibilityRe.. 阅读全文
posted @ 2012-01-09 11:27 董雨 阅读(283) 评论(0) 推荐(0)
摘要:“算法” - 程序的灵魂! 这两天碰到一个需要处理排序的场景! 我第一印象想到的是"冒泡排序",由于效率不是特别友好基本上弃用,后来选择了有广大好评的快速排序方式,Google了一下,很多朋友都提出了自己的解 决方案,大致实现思路都是一样的!我也改写了一份C#的:static ArrayList QuickSort(ArrayList arrayList) {if (arrayList.Count <=1) return arrayList;int pivotIndex = arrayList.Count /2;int pivot = (int)arrayList[p 阅读全文
posted @ 2012-01-06 15:19 董雨 阅读(283) 评论(0) 推荐(0)
摘要:1、反转一个链表。循环算法。 1 List reverse(List l) { 2 if(!l) return l; 3 list cur = l.next; 4 list pre = l; 5 list tmp; 6 pre.next = null; 7 while ( cur ) { 8 tmp = cur; 9 cur = cur.next; 10 tmp.next = pre 11 pre = tmp;... 阅读全文
posted @ 2012-01-06 15:18 董雨 阅读(217) 评论(0) 推荐(0)