整理临界值技术

临界值的使用:
CRITICAL_SECTION m_Lock;
全局开始使用前:InitializeCriticalSection(&m_Lock);
   使用中开始:EnterCriticalSection(&m_Lock);
 .......
   使用中结束:LeaveCriticalSection(&m_Lock);
全局结束使用:DeleteCriticalSection(&m_Lock);


使用步骤如下:

1、声明:
        CRITICAL_SECTION g_Ruby;  //一般声明成全局变量

2、初始化:
        void InitializeCriticalSection(CRITICAL_SECTION g_Ruby); //这个初始化是必须的

3、实施:
        EnterCriticalSection(CRITICAL_SECTION g_Ruby);
        LeaveCriticalSection(CRITICAL_SECTION g_Ruby);
//这个CriticalSection的实现与Unix中的信号量有些类似,但也有所不同,Unix信号量可以控制访问临界资源的线程数量,而
//CriticalSection只能一个线程访问临界资源

4、删除:
        DeleteCriticalSection(CRITICAL_SECTION g_Ruby);

5、其他:

5.1、尝试进入
        直接使用EnterCriticalSection存在一定的使用问题,那就是一旦资源正被占用,那么调用线程就会开始等待,而无法进行其他工作,因此可以使用:
        bool TryEnterCriticalSection(CRITICAL_SECTION g_Ruby);
        这个函数如果返回false就说明资源正被占用,那么调用线程可以继续做其他事情,而如果返回true,则与调用EnterCriticalSection一样的效果(即资源被分配给调用线程,并且必须与LeaveCriticalSection搭配使用)

5.2、与循环锁一起使用(只用于多处理器)
        循环锁的作用是可以指定线程在多少次尝试进入CriticalSection失败后再开始等待:
        BOOL InitializeCriticalSectionAndSpinCount(CRITICAL_SECTION g_Ruby, DWORD dwSpinCount);
        下面函数可以设置dwSpinCount的值:
        DWORD SetCriticalSectionSpinCount(CRITICAL_SECTION g_Ruby, DWORD dwSpinCount); 

你可能感兴趣的:(整理临界值技术)