Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16497849
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 20:57:11

下载本文示例代码
天极IT资讯短信服务 电脑小技巧 function check4() { if (dn.mobile.value.length!=11) { alert("手机号码不正确!"); dn.mobile.focus(); return false; } return true; } 资费:包月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加工提供的Ⅱ零件以装配Ⅰ零件。由于他们之间再没有其他任何人帮助通信或其他通信手段(如等腻了走过去看看),他们都是坐在办公室里等着对方因为零件加工好而欲提供的电话,也就永远都不会等到电话而变成一个死局。  这种就是死锁,双方互相等待,此属于逻辑错误,并不像上面的线程冲突那样可以通过固定的方法解决,这是设计算法时犯下的错误,当线程较多,相互间关系复杂时是很容易产生的,可以通过断言来帮助检查。  因此一段代码被称为线程安全的,就是指这段代码不会发生线程冲突或死锁。zmbbs=1;共3页。 1 2 3 : 天极IT资讯短信服务 电脑小技巧 function check4() { if (dn.mobile.value.length!=11) { alert("手机号码不正确!"); dn.mobile.focus(); return false; } return true; } 资费:包月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加工提供的Ⅱ零件以装配Ⅰ零件。由于他们之间再没有其他任何人帮助通信或其他通信手段(如等腻了走过去看看),他们都是坐在办公室里等着对方因为零件加工好而欲提供的电话,也就永远都不会等到电话而变成一个死局。  这种就是死锁,双方互相等待,此属于逻辑错误,并不像上面的线程冲突那样可以通过固定的方法解决,这是设计算法时犯下的错误,当线程较多,相互间关系复杂时是很容易产生的,可以通过断言来帮助检查。  因此一段代码被称为线程安全的,就是指这段代码不会发生线程冲突或死锁。zmbbs=1;共3页。 1 2 3 : 下载本文示例代码


实战COM编程系列之一实战COM编程系列之一实战COM编程系列之一实战COM编程系列之一实战COM编程系列之一实战COM编程系列之一实战COM编程系列之一实战COM编程系列之一实战COM编程系列之一实战COM编程系列之一实战COM编程系列之一实战COM编程系列之一实战COM编程系列之一实战COM编程系列之一实战COM编程系列之一
阅读(146) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~