lesson4

来源:互联网 发布:july算法视频 百度盘 编辑:程序博客网 时间:2024/06/09 19:42

window下的四大锁

 

(1)临界区

    临界区是最简单的一种锁。基本的临界区操作有:

  1. InitializeCriticalSection
  2. EnterCriticalSection 
  3. LeaveCriticalSection 
  4. DeleteCriticalSection 

使用时候 主要是保护 EnterCriticalSection 和LeaveCritiSection  之间的代码。

(2) 信号量

    信号量是使用的最多的一种锁结果,也是最方便的一种锁。围绕着信号量,人们提出了很多数据互斥访问的方案,pv操作就是其中的一种。如果说互斥锁只能对单个资源进行保护,那么信号量可以对多个资源进行保护。同时信号量在解锁的时候,可以被另外一个thread进行解锁操作。目前,常用的信号量操作有:

       1.CreateSemaphore 

        2.OpenSemaphore 

        3.ReleaseSemaphore

 使用:

  1. WaitForSingleObject(/*...*/); 
  2. do_something();
  3. ReleaseSemaphore(/*...*/); 

注意:信号量在初始化的时候需要明确当前资源的数量和信号量的初始状态是什么。

 (3)互斥锁
  它可以被不同进程使用,因为它有名字。同时,获取锁和释放锁的线程必须是同一个线程。(不是很理解)

、常用的互斥锁操作有
    CreateMutex 

   OpenMutex 

   ReleaseMutex

使用:

WaitForSingleObject(/*...*/); 

 do_something(); 

 ReleaseMutex(/*...*/); 

 

event 对象
    event对象是windows下面很有趣的一种锁结果。从某种意义上说,它和互斥锁很相近,但是又不一样。因为在thread获得锁的使用权之前,常常需要main线程调用SetEvent设置一把才可以。关键是,在thread结束之前,我们也不清楚当前thread获得event之后执行到哪了。所以使用起来,要特别小心。

常用的event操作有:

  1. CreateEvent 
  2. OpenEvent 
  3. PulseEvent 
  4. ResetEvent 
  5. SetEvent 

    我们对event的使用习惯于分成main thread和normal thread使用。main thread负责event的设置和操作,而normal thread负责event的等待操作。在CreateEvent的时候,要务必考虑清楚event的初始状态和基本属性。
    对于main thread,应该这么做,

  1. CreateEvent(/*...*/); 
  2. SetEvent(/*...*/); 
  3. WaitForMultiObjects(hThread, /*...*/); 
  4. CloseHandle(/*...*/); 

    对于normal thread来说,操作比较简单,

  1. while(1){ 
  2.     WaitForSingleObject(/*...*/); 
  3.  
  4.     /*...*/ 


 

原创粉丝点击