当有多个线程的时候,经常需要 同步这些线程以访问同一个数据或者资源。
    例如:你有两个线程,一个用于读文件,一个用于统计文件里的字符,这样是需要有一个先后顺序的。但DELPHI对于线程的创建不是顺序等待执行而是创建后不等待直接运行下面一行代码。那么我们怎么办才能保证线程1读完文件后线程2才开始 统计呢?这就需要线程的同步了。
   学过操作系统的兄弟们应该知道,OS为了使任务同步通常采取了临界区、互斥同步和信号量机制。当时在学习的时候大家可能和我一样,不知所云,即使考试考完了仍然不知道这些东西到底怎么样。现在,它就有发挥的地方了。我们在采取线程同步就需要使用这些方法。
    一、临界区
    临界区的申明类为TRTLCriticalSection。设申明CS:TRTLCriticalSection.
    它有四个重要过程:InitializeCriticalSection(CS):初始化临界区,一般在主线程执行,建立一个临界区;EnterCriticalSection(CS):进入临界区,一般在线程内部执行;LeaveCriticalSection(CS):离开临界区,一般在线程内部执行,与上面的函数相对,就像理完发要让座一样。DeleteCriticalSection(CS):删除临界区,就像你的理发店倒闭了你要把理发椅子拿走。
    二、建立互斥变量
    互斥变量是一个HWND类型。说明型为mutex。
    它的创建为主线程中hMutex:=CreateMutex(nil,false,nil);
    调用函数WaitForSingleObject(hmutex,INFINITE)=WAIT_OBJECT_0来响应互斥变量。ReleaseMutex(hMutex)用于释放互斥变量。
    三、信号量
    信号量没申明好讲的,跟互斥变量的创建、响应、释放简直是一样只不过把mutex变成了Semaphore。但是信号量有一个好处,就是它可以创建一大堆的互斥变量。说白了仅仅是小理发店(互斥变量)只有一个师傅一把椅子,但大理发店(信号量)有10个师傅10把椅子。