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; }