Delphi中最常用的三种线程同步技术

来源:互联网 发布:ef执行sql语句 返回值 编辑:程序博客网 时间:2024/04/30 12:29
        线程是进程内一个相对独立的、可调度的执行单元。一个应用可以有一个主线程,一个主线程可以有多个子线程,子线程还可以有自己的子线程,这样就构成了多线程应用了。由于多个线程往往会同时访问同一块内存区域,频繁的访问这块区域,将会增加产生线程冲突的概率。一旦产生了冲突,将会造成不可预料的结果(该公用区域的值是不可预料的)可见处理线程同步的必要性。

        最近在做数据模块缓冲池中就需要用到线程同步的技术,也就顺便用简约的篇幅总结了Delphi中最常用的三种线程同步技术。

1.Critical Sections(临界区)
  代码中如果有不能由两个或两个以上线程同时执行的部分,可以用临界区来使这部分的代码执行串行化。
  它只能在一个独立的进程或一个独立的应用程序中使用。

使用方法如下:

//申明
var
  oCSect: TCriticalSection; // 临界区对象,保证多线程时存取数据模块的安全

//创建
oCSect := TCriticalSection.Create;

//进入临界区
oCSect.Enter;
try
  dosomething...//保护的代码
finally
  //离开临界区
  oCSect.Leave;
end;

//释放临界区
oCSect.Free;

2.Mutex(互斥对象)
  是用于串行化访问资源的全局对象。我们首先设置互斥对象,然后访问资源,最后释放互斥对象。在设置互斥对象时,如果另一个线程(或进程)试图设置相同的互斥对象,该线程将会停下来,直到前一个线程(或进程)释放该互斥对象为止。注意它可以由不同应用程序共享。

使用方法如下:

//申明
hMutex: HWND;

//创建
hMutex:=CreateMutex(nil,false,nil);

try
  WaitForSingleObject(hMutex,INFINITE);
  dosomething...//保护的代码
finally
  ReleaseMutex(hMutex);
end;

//销毁
CloseHandle(hMutex)

3.Semaphore(信号量)
  它与互斥对象相似,但它可以计数。例如可以允许一个给定资源同时同时被三个线程访问。其实Mutex就是最大计数为一的  Semaphore。

使用方法如下:

//申明
hSemaphore: THandle; // 并发许可数句柄

//建立信号灯 创建对象时指定最大可同时访问的线程数
//CreateSemaphore(lpSemaphoreAttributes As SECURITY_ATTRIBUTES,
// ByVal lInitialCount As Long, ByVal lMaximumCount As Long, ByVal lpName As String);
hSemaphore:= CreateSemaphore(nil,lInitialCount,lMaximumCount,lpName)
try
  WaitForSingleObject(hSemaphore,INFINITE);
  dosomething...//保护的代码
finally
  ReleaseSemaphore(hSemaphore, lReleaseCount, lpPreviousCount)
end;


//销毁
CloseHandle(hSemaphore)

当开发多线程应用时,并且多个线程同时访问一个共享资源或数据时,你是不是也该考虑线程同步的问题了?

原创粉丝点击