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

转载 2006年06月06日 09:39:00
      线程是进程内一个相对独立的、可调度的执行单元。一个应用可以有一个主线程,一个主线程可以有多个子线程,子线程还可以有自己的子线程,这样就构成了多线程应用了。由于多个线程往往会同时访问同一块内存区域,频繁的访问这块区域,将会增加产生线程冲突的概率。一旦产生了冲突,将会造成不可预料的结果(该公用区域的值是不可预料的)可见处理线程同步的必要性。

        最近在做数据模块缓冲池中就需要用到线程同步的技术,也就顺便用简约的篇幅总结了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)

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

相关文章推荐

Delphi下几种线程同步

====================================================== 注:本文源代码点此下载 =============================...

传统线程同步通信技术二

  • 2012-04-13 22:44
  • 76.58MB
  • 下载

Delphi线程同步

如果线程要调用VCL里面的内容(如:别的窗体中的控件),就需要将这个线程同步。线程同步表示交由主线程运行这段代码,各个线程都在主线程中分时间段运行。另外,要想避免多个线程同时执行同一段代码也需要将多线...

传统线程同步通信技术一

  • 2012-04-12 23:23
  • 69.06MB
  • 下载

delphi 线程同步的基本方法

上次跟大家分享了线程的标准代码,其实在线程的使用中最重要的是线程的同步问题,如果你在使用线程后,发现你的界面经常被卡死,或者无法显示出来,显示混乱,你的使用的变量值老是不按预想的变化,结果往往出乎意料...

线程同步的问题(delphi语言)

今天在网上关于线程同步的问题,文章写的很详细,在此写下本文以便日后查看。  总的来说,关于线程同步的方法,主要有三个:1.临界区   2.互斥对象  3.信号量 以下是从网络上抓取来的内容。 出...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)