C++ CRITICAL_SECTION 临界区

个人感觉这临界区相当于java 中的sy 关键字那种 相当于重度锁吧 加锁之后 只允许本线程读写 其他线程读都不能 效率有点低

类似于 你上厕所锁门 别人就进不来 其他人想要使用时没法使用等你出来了才可以使用


typedef struct _RTL_CRITICAL_SECTION {
PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
LONG LockCount;
LONG RecursionCount;
HANDLE OwningThread;
HANDLE LockSemaphore;
DWORD SpinCount;
} RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION;

LockCount:
它被初始化为数值 -1
此数值等于或大于 0 时,表示此临界区被占用

等待获得临界区的线程数:LockCount - (RecursionCount -1)

RecursionCount:
此字段包含所有者线程已经获得该临界区的次数

OwningThread:
此字段包含当前占用此临界区的线程的线程标识符
此线程 ID 与GetCurrentThreadId 所返回的 ID 相同

下面是一段伪代码 如果不出错的话应该输出4000

#include <iostream>
#include<windows.h>
using namespace std;
CRITICAL_SECTION ics;

int icount=0; 
DWORD WINAPI ThreadA(LPVOID lp)
{

    for(int i=0;i<1000 ;i++ )
    {
//    EnterCriticalSection(&ics);
    Sleep(1);
    icount++;
//    LeaveCriticalSection(&ics);
     }
    

    
return 0;
}

DWORD WINAPI ThreadB(LPVOID lp)
{

    for(int i=0;i<1000 ;i++ )
    {
//    EnterCriticalSection(&ics);
        Sleep(1);
        icount++;
//    LeaveCriticalSection(&ics);
    }
    
    
return 0;
}

DWORD WINAPI ThreadC(LPVOID lp)
{
    
    for(int i=0;i<1000 ;i++ )
    {
//        EnterCriticalSection(&ics);
        Sleep(1);
        icount++;
//        LeaveCriticalSection(&ics);
    }
  
return 0;
}

DWORD WINAPI ThreadD(LPVOID lp)
{
    
    for(int i=0;i<1000 ;i++ )
    {
//    EnterCriticalSection(&ics);
         Sleep(1);
        icount++;
//      LeaveCriticalSection(&ics);
    }
    
    return 0;
}
int main(int argc, char *argv[])
{   InitializeCriticalSection(&ics);
    HANDLE ha=CreateThread(NULL,0,ThreadA,NULL,0,NULL);
    HANDLE hb=CreateThread(NULL,0,ThreadB,NULL,0,NULL);
     HANDLE hC=CreateThread(NULL,0,ThreadC,NULL,0,NULL);
    HANDLE hD=CreateThread(NULL,0,ThreadD,NULL,0,NULL);
   
    ::WaitForSingleObject(ha,INFINITE); 
    ::WaitForSingleObject(hb,INFINITE); 
    ::WaitForSingleObject(hC,INFINITE); 
    ::WaitForSingleObject(hD,INFINITE); 
    printf("%d",icount);
    return 0;
}
原文地址:https://www.cnblogs.com/xuexidememeda/p/12653096.html