• 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;
    }
  • 相关阅读:
    java.lang.NoClassDefFoundError的原因及解决
    关于安卓应用(APK文件)的二次打包
    Android应用Icon大小在不同分辨率下定义
    Android常见错误
    RelativeLayout相对布局 安卓布局技巧
    onTextChanged参数解释及实现EditText字数监听
    Django 基础
    Django 入门
    paramiko模块实现堡垒机
    Python操作MySQL
  • 原文地址:https://www.cnblogs.com/xuexidememeda/p/12653096.html
Copyright © 2020-2023  润新知