欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

windows C/C++ 线程安全(一)临界区

程序员文章站 2022-07-05 10:35:41
...

承接上面一篇讲了线程创建部分:https://blog.csdn.net/uVarAndMethod/article/details/90358925

临界区的使用

	1、创建CRITICAL_SECTION:									
	CRITICAL_SECTION cs;					
						
	2、在使用前进行初始化					
	InitializeCriticalSection(&cs);					
						
	3、在函数中使用:					
	DWORD WINAPI 线程A(PVOID pvParam) 					
	{					
	      EnterCriticalSection(&cs);									
	      //对全局遍历X的操作								
	      LeaveCriticalSection(&cs);					
	   return(0);					
	}					
						
	DWORD WINAPI 线程B(PVOID pvParam) 					
	{					
	      EnterCriticalSection(&g_cs);					
	      //对全局遍历X的操作							
	      LeaveCriticalSection(&g_cs);					
	   return(0);					
	}					
						
	4、删除CRITICAL_SECTION									
	VOID DeleteCriticalSection(PCRITICAL_SECTION pcs);									
	当线程不再试图访问共享资源时					

    	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 相同