zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    设计模式之-工厂模式、构造函数模式
    发布订阅小示例
    使用vue,react,angular等框架和不使用框架使用jquery的优缺点
    react优化--pureComponent
    Vue、 React比较
    ORACLE触发器和new、old特殊变量
    mysql的存储过程与自定义函数
    MySQL日期
    php(Personal Home Page)简介,安装和配置(apache服务器使用和配置1)
    话谈html语义化
  • 原文地址:https://www.cnblogs.com/xuexidememeda/p/12653096.html
Copyright © 2011-2022 走看看