<一>临界段

       临界段对象通过提供所有线程必须共享的对象来控制线程。只有拥有临界段对象的线程才能够访问保护的资源。在另一个线程可以访问该资源之前,前一线程必须释放临界段对象,一遍新的线程可以获取对对象的访问权。

注意:互斥量是内核对象,可以跨进程使用,而临界段对象只能在进程内的线程间使用(虽然互斥量可以用于进程内的线程,但线程间的通信,互斥量没有临界段对象高效)。

与临界段有关的API函数

名称 作用
InitializeCriticalSection() 创建一个临界段
DeleteCriticalSection() 释放一个临界段
EnterCriticalSection() 获取对临界段的所有权,独占共享资源
TryEnterCriticalSection() 试图获得对临界段的所有权,但不阻塞
LeaveCriticalSection() 释放对资源的所有权

例子:

 

#include <iostream>
#include <windows.h>
#include "process.h"
using namespace std;

CRITICAL_SECTION cs;

int a[5],i;

void Thread()
{
    int num=0;
    while(true)
    {
        EnterCriticalSection(&cs);
        for (i=0;i<5;i++)
        {
            a[i]=num;
        }
        LeaveCriticalSection(&cs);
        num++;
    }
}

int main()
{
    InitializeCriticalSection(&cs);
    CreateThread(0,0,(LPTHREAD_START_ROUTINE)Thread,0,0,0);
    while(true)
    {
        EnterCriticalSection(&cs);
        for (i=0;i<5;i++)
        {
            cout<<a[i]<<"  ";
        }
        LeaveCriticalSection(&cs);
        
    } 
    return 0;
}