博文

FAQ 05:为什么可以在不结束线程的情况下关闭起handle(2007-12-12 10:56:00)

摘要:             线程的handle是指向“线程核心对象”,而不是指向线程本身。对大部分API而言,这项差异没什么影响。当调用CloseHandle()并给予它一个线程handle时,只不过是表示,希望自己和此核心对象不再有任何瓜葛。CloseHandle()惟一做的事情就是把引用计数减1。如果该值变成0,对象会自动被OS销毁。             “线程核心对象”引用到的那个线程也会令核心对象开启。因此,线程对象的默认引用计数是2当调用CloseHandle()后,引用计数会减1,当线程结束时,引用计数再减1.只有当两件事情都发生了(不管顺序如何)的时候,这个对象才会被真正清除。               “引用计数”机制保证新的线程有个地方可以写下返回值。这样的机制也保证旧线程能够读取那个返回值----只要她没有调用CloseHandle()。                由于被CreateThread()传回的那个handle属进程所有,而非线程所有,所以很可能有一个新产生的线程调用CloseHandle(),取代原来的线程。MS Visual C++ runtime Library中等_beginthread()就是这么做的 。......

阅读全文(3123) | 评论:0

FAQ 04:为什么我应该调用CloseHandle()?(2007-12-12 10:41:00)

摘要:当完成工作后,应该调用CloseHandle释放核心对象 BOOL  CloseHandle( HANDLE    hObject ); 参数    hObject   代表一个已打开对象handle 返回值          如果成功,CloseHandle()返回TRUE。如果失败则返回FALSE,此时可以调用GetLastError()获知失败原因。          如果一个进程没有在结束前针对它所打开的核心对象调用CLoseHandle(),OS会自动把那些对象的引用计数下降1。虽然可以依赖OS做实体(physical)上的清除(cleanup)工作,然而逻辑上的清除工作又是完全不同的一回事,特别是如果你有许多个进程的话。因为OS并不知道对象实际代表什么意义,所以它不可能知道解构顺序是否重要。         如果一个进程常常产生“worker线程”而总不关闭线程的handle,那么这个进程可能最终有数百个甚至更多的个开启的“线程核心对象”留给OS去清理。这样的resource leaks可能会对效率带来负面影响。    另外一点也很重要:不可以依赖“因线程的结束而清理所有被这一线程产生的核心对象”。许多对象,例如文件,是被进程拥有,而非被线程拥有。在进程结束之前不能够清理它们!......

阅读全文(4012) | 评论:0

FAQ 03:线程和进程有何不同?(2007-12-07 13:01:00)

摘要:           从Win32的角度来看,进程含有内存和资源。被进程拥有的内存,理论上可以高达2GB。资源则包括核心对象(如file handles和线程)、USER资源(比如对话框和字符串) 、GDI资源(比如Devic Context和brushes)。         Matt Pietrek在其Windows 95 System Porgramming SECRETS一书中解释进程:就是一大堆对象的拥有权的集合,也就是说,进程拥有对象。进程可以拥有内存(更精确地说是拥有memory context),可以拥有file handles,可以拥有线程,可以拥有一大串DLL模块(被载入这一进程的地址空间中)。 另:内存可以大致分为三种类型: 1、Code         是程序的可执行部分,一定是只读性质。这是CPU唯一允许执行的内存。可执行Windows NT的两种芯片:Intel芯片和RISC芯片 2、Data          是程序中的 所有变量(不包括函数中的局部变量),可以区分为全局变量和静态变量两种。当然,线程也可以使用malloc()或new()动态配置内存。 3、Stack          调用函数时所用的堆栈空间,其中有局部变量。每个线程产生时配有一个堆栈。如果不需要,OS会将它动态扩充。   所有这些内存对进程中的所有线程都是可用的。这在多线程程序中虽然带来了很大的方便,却也带来了很大的灾难。......

阅读全文(2847) | 评论:0

FAQ 02:我可以在Win32s中使用多个线程吗?(2007-12-07 12:36:00)

摘要:        NT有一组全新的API,名为Win32,是Windows 3.1 API的超集。 Win32 API被移植到Windows 3.1上,称为Win32s.不幸的是许多功能无法移植。Win32s即不支持也不支持抢先式多任务也不支持多线程。......

阅读全文(2434) | 评论:0

FAQ 01:合作型多任务与抢先式多任务有和区别(2007-12-04 19:59:00)

摘要:FAQ 01:合作型(coorperative)多任务与抢先式(preemptive)多任务有和区别 Micorsoft Windows的前三个版本(1,2,3)都允许同时执行多个程序,但分享CPU的是程序(而不是OS)的责任。如果有一个程序决定咬住CPU不放,其他程序就停摆了。因此,我们说windows是“合作型多任务”。在2.0和3.0那个时代,还是有许多程序拒绝与别人共享资源,慢慢地大家都进步了,也学习到如何写一个“举止良好”的程序。但这还是花费了大家许多宝贵的精力在诸如“调试”这样的工作上。 由于windows的底层依赖DOS,当格式化一张磁盘或拷贝一个文件到软盘上时,依然让任何其他人都动弹不得。 当此之时,Unix,VMS,AmigaDOS等OS都已经支持一种名为“抢先式多任务”的模式,意思是OS能够强迫应用程序把CPU分享非其他人,程序员不需要什么额外的努力。  ......

阅读全文(3411) | 评论:0

C++ STL编程轻松入门基础(2007-12-01 20:27:00)

摘要:作为C++标准不可缺少的一部分,STL应该是渗透在C++程序的角角落落里的。STL不是实验室里的宠儿,也不是程序员桌上的摆设,她的激动人心并非昙花一现。本教程旨在传播和普及STL的基础知识,若能借此机会为STL的推广做些力所能及的事情,到也是件让人愉快的事情。 1 初识STL:解答一些疑问 1.1 一个最关心的问题:什么是STL "什么是STL?",假如你对STL还知之甚少,那么我想,你一定很想知道这个问题的答案,坦率地讲,要指望用短短数言将这个问题阐述清楚,也决非易事。因此,如果你在看完本节之后还是觉得似懂非懂,大可不必着急,在阅读了后续内容之后,相信你对STL的认识,将会愈加清晰、准确和完整。不过,上述这番话听起来是否有点像是在为自己糟糕的表达能力开脱罪责呢?:) 不知道你是否有过这样的经历。在你准备着手完成数据结构老师所布置的家庭作业时,或者在你为你所负责的某个软件项目中添加一项新功能时,你发现需要用到一个链表(List)或者是映射表(Map)之类的东西,但是手头并没有现成的代码。于是在你开始正式考虑程序功能之前,手工实现List或者Map是不可避免的。于是……,最终你顺利完成了任务。或许此时,作为一个具有较高素养的程序员的你还不肯罢休(或者是一个喜欢偷懒的优等生:),因为你会想到,如果以后还遇到这样的情况怎么办?没有必要再做一遍同样的事情吧! 如果说上述这种情形每天都在发生,或许有点夸张。但是,如果说整个软件领域里,数十年来确实都在为了一个目标而奋斗--可复用性(reusability),这看起来似乎并不夸张。从最早的面向过程的函数库,到面向对象的程序设计思想,到各种组件技术(如:COM、EJB),到设计模式(design pattern)等等。而STL也在做着类似的事情,同时在它背后蕴涵着一种新的程序设计思想--泛型化设计(generic programming)。 继续上面提到的那个例子,假如你把List或者map完好的保留了下来,正在暗自得意。且慢,如果下一回的List里放的不是浮点数而是整数呢?如果你所实现的Map在效率上总是令你不太满意并且有时还会出些bug呢?你该如何面对这些问题?使用STL 是一个不错的选择,确实如此,STL可以漂亮地解决上面提到的这些问题,尽管你还可以寻求其他方法。 说了半天,到底STL是什么东......

阅读全文(6635) | 评论:0

STL使用入门( Using STL) (2007-12-01 19:34:00)

摘要:0 前面的话(Winter) C++已经在中国相当普及,但C++ STL却使用的人不多。许多人有一定成见,认为STL降低了C++的效率。特别是那些自诩为技术专家的人,他们一直使用C语言,对于新事物总是先用批判的眼光对待......先不说这些,我这几天看见http://stl.winterxy.com网站上的这篇小文,发现写得简明扼要,通俗易懂。翻译出来,希望对STL的普及有一定帮助。 1 介绍 我最开始结束C++编程是从DOS下的Borland C++开始的。那时他们在最新版本3.1中就包含了一套模板库用来做collection.那真是个好东东。当我开始使用Visual C++ 2.2的时候,我甚至试图去把Borland公司的collection模板库嵌入到Visual C++中去,但是没有成功。唯一可行的解决方案是切换到微软(Microsoft)的collection上,它是MFC的一部分分。但总是有些问题,其原因如下: 一旦实现部分已经代码写完,很难从一种容器(container)类型切换到另外一种容器。 不同容器的迭代器(Iterators)不一样。 如果你在写一个DLL(动态链接库), 服务程序(service)或者终端应用程序,需要用到容器,你要么动态要么静态链接MFC,这使得你不得不依赖于MFC. 最近我开始使用STL,发现它真是太棒了!入门可能稍微难一些,但一旦你开始了,它就变得非常容易。本文包含了一些使用STL的入门经验,主要是面向那些希望能快速使用STL又不想了解那些琐碎细节的程序员。 2 规则 Rule 1: 你可以生成STL容器,用来存放对象或者指向对象的指针。 class TMyClass; typedef list<TMyClass> TMyClassList; // 用于存放对象的list容器 typedef list<TMyClass*> TMyClassPtrList; // 用于存放对象指针的list容器一般来说,list容器用于存放对象。但是,如果你是需要保存一些机器资源(例如,文件句柄,命名管道、套接字(socket)或者其他类似的资源),那么你需要使用list来保存指向这些对象的指针。 如果容器是保存的对象,则在容器析构的时候会自动清理这些......

阅读全文(6480) | 评论:0

[C++] 斐波那契数列 (2007-12-01 19:29:00)

摘要:
来源:蚂蚁的 C/C++ 标准编程 作者:Antigloss 等级:一般
发布于2007-06-16 11:46 被读1063次 【字体:大 中 小】     菲波那契数列(Fibonacci sequence)指的是这样一个数列:         1,1,2,3,5,8,13,21,34,55,…… 这个数列从第三项开始,每一项都等于前两项之和。可将其递归定义为:         F(1) = 1
        F(2) = 1
        F(n) = F(n - 1) + F(n - 2)     n > 2 因此,可用递归的办法编写程序计算该数列第 N 项的值:         // header inherited from ISO C
        #include <cassert>               // for assert
        // boost header
        #include <boost/bigint.hpp>      // for bigint         boost::bigint fibonacc......

阅读全文(5828) | 评论:0

影响世界的100个管理定律(2007-11-29 19:41:00)

摘要:影响世界的100个管理定律
第一章:管人用人育人留人之道
  1. 奥格尔维定律 :善用比我们自己更优秀的人
  2. 光环效应:全面正确地认识人才
  3. 不值得定律:让员工选择自己喜欢做的工作
  4. 蘑菇管理定律 :尊重人才的成长规律
  5. 贝尔效应:为有才干的下属创造脱颖而出的机会
  6. 酒与污水定律:及时清除烂苹果
  7. 首因效应:避免凭印象用人
  8. 格雷欣法则:避免一般人才驱逐优秀人才
  9. 雷尼尔效应:以亲和的文化氛围吸引和留住人才
  10.适才适所法则:将恰当的人放在最恰当的位置上
  11.特雷默定律:企业里没有无用的人才
  12.乔布斯法则:网罗一流人才
  13.大荣法则:企业生存的最大课题就是培养人才
  14.海潮效应 :以待遇吸引人,以事业激励人

第二章:以人为本的人性化管理
  古语云:得人心者得天下!在企业管理中多点人情味,有助于赢得员工对企业的认同感和忠诚度。只有真正俘获了员工心灵的企业,才能在竞争中无往而不胜。
  15.南风法则:真诚温暖员工
  16.同仁法则:把员工当合伙人
  17.互惠关系定律:爱你的员工,他会百倍地爱你的企业
  18.蓝斯登定律:给员工快乐的工作环境
  19.柔性管理法则:“以人为中心”的人性化管理
  20.坎特法则:管理从尊重开始
  21.波特定律:不要总盯着下属的错误
  22.刺猬法则:与员工保持“适度距离”
  23.热炉法则:规章制度面前人人平等
  24.金鱼缸效应:增加管理的透明度

第三章:灵活有效的激励手段
  有效的激励会点燃员工的激情,促使他们的工作动机更加强烈,让他们产生超越自我和他人的欲望,并将潜在的巨大的内驱力释放出来,为企业的远景目标奉献自己的热情。
  25.鲶鱼效应:激活员工队伍
  26.马蝇效应:激起员工的竞争意识
  27. 罗森塔尔效应:满怀期望的激励
  28. 彼得原理:晋升是最糟糕的激励措施
  29.“保龄球”效应:赞赏与批评的差异
  30.末位淘汰法则:通过竞争淘汰来发挥人的极限能力
......

阅读全文(1662) | 评论:0

你知道菩萨为什么灵验,香火不绝吗?----CEO必读(2007-11-29 19:13:00)

摘要:你知道菩萨为什么灵验,香火不绝吗?

我刚升上总经理职位的时候,很不习惯没有直接指挥的单位,
也很不习惯没有直接负责的工作,因此,没事就召集各个运营单位开会,
直接参与各个单位的运作,彷佛我就是部门主管一般。

直到有一天,一个部门主管告诉我:「何先生,你知道菩萨为什么灵验,香火不绝吗?
因为他们宝相庄严,高高在上,不会下凡过问凡间事物。

而当凡夫俗子有困难来求神问卜时,菩萨才会显灵指点,有求必应。
因此凡人皆感念菩萨之德,香火不断。」
这位主管说得文雅,意在言外,一时我还听不懂。
最后他才直截了当告诉我:「何先生,你高高在上当你的总经理就好了,管管大事,制定决策,不要直接降临各单位,指东说西,这样各单位主管要怎么工作啊?
更何况,以总经理之尊,离开执行面很远,很多事已在状况外,很多决定可能是错的。
喜欢下凡的菩萨,多数只会显现自己的无能,不会赢得尊敬的。」

听完这段话,我一身冷汗,原来我完全不会当总经理、不会当主管。
制定决策、分工设职,让所有的主管层层负责,发挥所长,是上位主管该做的事,
千万不要亲力亲为,和部属抢事做,这样只会让下属难为,让部属愚民化。
许多刚升任主管的人,还是习惯扮演执行者的角色,不知道运用团队的力量,结果是自己忙死、部属哀怨(因为没有发挥的空间),而且无所适从。
我就曾经是这样令人讨厌的主管。

另一种类似的状况,也会出现在创业者身上。
一般而言,创业主都是能干的老板,尤其在创业阶段,人力、财力都不足时,
通常要靠创业主亲力亲为,才能突破困境,因此创业主习惯自己动手做。

可是当组织变大、规模变大时,如果创业主不了解「宝相庄严」才能香火不绝的道理,
通常会出现组织规模变大的不适应症。

我也曾听创业主抱怨,部属能力不足、团队不佳,其实真正的原因是老板能力强,
无法忍受部属的不足,以至于老是自己动手做,结果当然无法培养出好的团队、好的部属。

我甚至曾经要求一位主管,禁止他自己下手执行工作。
因为他嫌部属动作慢,做事不到位,于是老是自己做。
我告诉他,就算失手,也要让部属独力完成,他的协助,只会让团队继续无力、无能。

想大事......

阅读全文(1809) | 评论:0