科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件实战COM编程系列之一

实战COM编程系列之一

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本系列文章是《COM线程模型》这篇文章的样例,提供一个简单的稍完整的例子以帮助理解前面文章中的内容。

作者:lop5712 来源:论坛 2007年10月20日

关键字: 实战 COM 编程

  • 评论
  • 分享微博
  • 分享邮件
我曾经写了一篇《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加工提供的Ⅱ零件以装配Ⅰ零件。由于他们之间再没有其他任何人帮助通信或其他通信手段(如等腻了走过去看看),他们都是坐在办公室里等着对方因为零件加工好而欲提供的电话,也就永远都不会等到电话而变成一个死局。

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

  因此一段代码被称为线程安全的,就是指这段代码不会发生线程冲突或死锁。
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章