RSS订阅 | 匿名投稿
您的位置:网站首页 > 线程 > 正文

Delphi多线程

作者:admin 来源: 日期:2011/8/22 16:39:20 人气: 标签:

 在Delphi中,多线程的应用是比较多的内容,同时由于现在CPU中多核的发展,开发多线程程序也显得较为重要,对于多线程包含有几种状态(创建,运行,挂起,唤醒,销毁)如不清晰的请自己查找相关的资料查看.本文本是在多线程中重点需要注意的几个方面的问题进行说明
  1.使用Synchronize方法
  对VCL的访问只能在主线程中进行,这意味着所有需要与用户打交道的代码都只能在主线程的环境中执行.通过TThread类中提供的Synchronize方法,可以实现此要求.对于此类的说明较多,不重点说明
  2.多线程的同步机制
  对于多线程的同步机制是说明的重点,主要是说明对于多线程几种同步的方式进行比较说明.在多线程中同步机制主要是采用Windows API函数提供的同步机制:临界区(Critical Section),互斥对象(Mutex)技术和信号量(Semaphore)技术.
  (1)临界区
   临界区技术是指源代码不能有两个线程同时执行的部分,实际上临界区是一小段代码,一次只允许一个线程执行这段代码.在这段代码中可以执行以前要求对某些共享数据进行排它的存取.使用起来最为简单,但是它只能用来同步单个进程中的线程.临界区一次只允许一个线程取得对一个数据区的存取权.
  在使用临界区之前,必须使用InitializeCriticalSection过程进行初始化.其声明如下:
  procedure InitializeCriticalSection (var lpCriticalSection:TRTLCriticalSection);stdcall;
  使用临界区时可以使用EnterCriticalSection与LeaveCriticalSection来进行临界资源的管理
(2)互斥对象
  它们可以被用来同步多个进程间的数据访问.互斥的一船使用流程是,进程必须首先用CreateMutex函数创建互斥对象,然后利用WaitForSingleObject进入互斥环境,当用到同步的代码执行完成后,用ReleaseMutex解除互斥关系,当所有线程访问完后,调用CloseHandle方法释放互斥对象.
  两个进程之间必须都用同一互斥对象的句柄.互斥对象实际上串行访问资源的全局对象.互斥对象不仅能在同一个程序下工作,而且可以在多个进程中同时工作.换句话说,它们既能够在单个应用程序下使两个或更多线程同步,也可以在不同的应用程序下进行多线程操作.
 
   注:临界区与互斥对象技术的区别如下:
  a.临界区调用的是EnterCriticalSection和LeaveCriticalSection,而互斥对象调用的是WaitForSingleObject和ReleaseMutex
  b.互斥对象可以用于跨进程边界同步线程
  c.我们可以给互斥对象取字符串类型的名字,对于一个已知的互斥对象,我们可以通过引用互斥对象的名字来使用它
 
 (3)信号量
  操作系统并不对某个线程拥有信号量进行跟踪.因此,一个线程等待某个信号量对象,观览由另一个线程来释放该信号量是可能的;另一个区别是,信号量有一个与之联系的资源计数,一个互斥对象只允许一个线程获得对它的访问许可,而一个信号量却允许多个线程同时获得对它的访问许可.
  信号量创建时使用CreateSeaphore来创建,调用WaitForSingleObject来计数值加1,用ReleaseSemphore来释放一个信号量,信号量的关闭采用CloseHandle进行处理

读完这篇文章后,您心情如何?
0
0
0
0
0
0
0
0
本文网址: