您的位置:软件 > 开发者网络 > 开发工具 > 开发专栏 > VC > 正文
实战COM编程系列之一
[文章信息]
作者:petrery编译
时间:2004-05-04
出处:
责任编辑:方舟
[文章导读]
本系列文章是《COM线程模型》这篇文章的样例,提供一个简单的稍完整的例子以帮助理解前面文章中的内容
advertisement
热点推荐
· 天极网软件频道改版调查
· 10.26精选 图画:葡萄小鸡图
· Windows操作系统网络管理技巧
· Fireworks国画:葡萄小鸡图
· 黑客张大民江南小城奇遇记
[正文]

1 2 3  下一页

天极IT资讯短信服务 电脑小技巧
资费:包月5元
手机:
介绍:细处着手,巧处用功。高手和菜鸟之间的差别就是:高手什么都知道,菜鸟知道一些。电脑小技巧收集最新奇招高招,让你轻松踏上高手之路。


  我曾经写了一篇《COM线程模型》,受到一些好评,但也有部分人觉得其有些深,希望能提供一些基础点的文章。本系列文章是《COM线程模型》这篇文章的样例,提供一个简单的稍完整的例子以帮助理解前面文章中的内容。本文是此系列的第一篇,讲解《COM线程模型》中出现过的我以为可能需要说明的基础概念,在后继的文章中说明样例的结构,并给出相关各部分代码,以注释作为主要说明手段。

  线程

  线程是具有进程能动性的逻辑概念。所谓能动性是指能使某种东西按某种规则动起来的特性,而所谓的"动"就是前面的"某种东西"的状态的改变。那么进程能动性即使进程按某种规则运行的性质,这里的"某种规则"即是CPU的机器指令的定义。可以简单地将线程看成是操纵机器的工人,而机器就相当于电脑硬件,而这个工人的工作就是代码。工作由老板制定好后,就等着工人去做。没人做的事就和代码一样,没有任何意义。当一个工人去操纵机器进行工作,就相当于一个线程通过CPU执行进程中的代码。毛坯由于人操作机器而改变它的状态进而变成产品,进程因为线程让CPU执行进程中的代码(准确地说应该是CPU对指定数字的反应)而改变它所拥有的内存的状态,进而将计算结果表现出来。

  线程就等同于时间,时间是具有客观世界能动性的逻辑概念,其使客观世界按上帝制订的高深莫测的规律变化其自身的状态。线程则使进程中的内容(包括代码)按CPU的机器指令的定义来改变进程的状态(其内存的数值)。

  应该将线程句柄和线程区分开来。线程句柄是个对象,即一个结构,其具体定义是由操作系统决定的,并一定关联着一个线程。它相当于是一个日志记录,其和线程没有什么关系,只是一个记录其相关线程的一些状态,如线程是否在等待、线程的消息队列等,操作系统利用线程句柄对线程进行操作,如发送线程消息、等待线程结束等。

  由于线程句柄只是一个对象,相当于一条记录,所以即使其关联的线程已经不存在了(线程退出了),其也是有效的。就好像一个人死了,但他的身份证还是存在的(虽然已经没有意义了)。并且即使线程句柄已经通过CloseHandle释放掉了(准确地说只是引用记数减一,因为操作系统在线程未退出时还保留着其一个引用)也并不代表线程结束了,它只是一个结构,记录线程的相关信息,与线程本身并无关系。

  线程安全

  前面说过线程就相当于一个工人,可以两个工人同时操作一台机器,这两个工人就必须分工合作,A工人设置了机器的加工速度为10,然后他还没有开始用10这个加工速度加工零件,B工人就又将加工速度定为了20,如果A不知道,这非常有可能导致事故发生。此时我们就说机器的加工速度的设置不安全——任何人都可以在不发出任何通知的前提下改变它。

  因此就规定这个机器只能由一个工人操作,不准同时有两个工人操作这台机器,此同步手段在编程时是通过程序中只有一个线程来实现的。

  此机器比较先进,可以同时做很多事情,如果只让一个工人操作效率太低。故决定让两个工人操作,但是在设置加工速度时,在设置把手处挂一个牌子,如果A已经设置了加工速度并正在加工零件,就将牌子写有“使用中”字样的一面朝外,用完后再将牌子写有“未使用”的一面朝外。这样就实现了对加工速度设置的同步。此在Windows编程时一般是通过互斥量(Mutex)来实现的。

  因此,当多个线程都需要操作进程中某块内存时,这块内存就和上面的“机器的加工速度”一样,对其的改变需要施加同步手段以防止出现问题。当由于这个原因而出现问题时,此问题一般就被称为线程冲突(Race Condition)。

  除了上面提到的线程冲突外,还有一种称为死锁(Deadlock)的线程安全问题。比如A工人为了加工Ⅲ零件在等待B提供的Ⅰ零件,而B正好在等待应由A加工提供的Ⅱ零件以装配Ⅰ零件。由于他们之间再没有其他任何人帮助通信或其他通信手段(如等腻了走过去看看),他们都是坐在办公室里等着对方因为零件加工好而欲提供的电话,也就永远都不会等到电话而变成一个死局。

  这种就是死锁,双方互相等待,此属于逻辑错误,并不像上面的线程冲突那样可以通过固定的方法解决,这是设计算法时犯下的错误,当线程较多,相互间关系复杂时是很容易产生的,可以通过断言来帮助检查。

  因此一段代码被称为线程安全的,就是指这段代码不会发生线程冲突或死锁。


1 2 3  下一页

·"WAP天极之IT新闻资讯,50万元等你拿"    ·天极WAP之游戏狂图,50万元等你下载


发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容阅读排行榜
  • COM线程模型详解
  • 用VC++实现ODBC数据源设置
  • Visual C++中的ODBC编程实例
  • 基于COM接口的Shell扩展技术应用
  • Visual C++编程实现全屏幕显示
  • 改善电视卡接收效果三个诀窍
  • 液晶该不该使用屏保等问答6则
  • 自力更生维修4.1音箱实例
  • 发烧大餐 六千元游戏配置
  • 10.26精选 图画:葡萄小鸡图
  • 网络打印服务器选购攻略
  • 信不信集成显卡BIOS我也照刷
  • 李鬼哪里逃 处理器假货曝光
  • Advertisement

    天极无线
    待机彩图    >>更多
    多彩动画    >>更多
    美妙和弦    >>更多
    天使在唱歌
    壁虎漫步
    PrettyBoy
    LoveLoveLove
    我是你的小小狗
    单身情歌
    十面埋伏
    祝酒歌
    回心转意
    波斯猫
    太委屈
    S.H.E
    潘玮柏
    M2M
    蔡依林
    阿牛
    林志炫
    陈弈迅
    刀郎
    黑龙
    S.H.E
    陶晶莹
    情人玫瑰坊
    音乐风云
    新片速递
    神秘测试
    都市约会
    ·天极彩信天天精彩
    ·图铃梦工厂下载无限!
    ·找寻童真,卡通专题
    ·夏日激情交友社区!
    ·星座运程,预测人生

    CSEEK搜索