临界区
临界区作用
线程在执行代码时,将代码锁定,不允许其他线程执行,只有该线程离开后, 其他线程才能使用这些代码临界区的使用
2.1 初始化临界区
VOID InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection
//临界区结构地址
);
2.2 临界区加锁
VOID EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection // pointer to critical
//临界区
);
2.3 临界区解锁
VOID LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection
// 临界区
);
2.4 释放临界区
VOID DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection
//临界区
);
3 和原子锁相比
原子锁是一条语句 临界区可以完成多条语句的锁定.
// CriticalSection.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "conio.h"
#include "windows.h"
CRITICAL_SECTION g_cs = { 0 };
LONG nValue = 0;
void Print( )
{ //进入临界区 - 加锁
EnterCriticalSection( &g_cs );
printf( "Long long long.......\n" );
nValue++;
//离开临界区 - 解锁
LeaveCriticalSection( &g_cs );
}
DWORD WINAPI PrintProc( LPVOID pParam )
{
while( 1 )
{
Print( );
Sleep( 100 );
}
return 0;
}
void Create( )
{
DWORD nThreadID = 0;
HANDLE hThread[2] = { 0 };
hThread[0] = CreateThread( NULL, 0,
PrintProc, NULL, 0, &nThreadID );
hThread[1] = CreateThread( NULL, 0,
PrintProc, NULL, 0, &nThreadID );
getch( );
}
int main(int argc, char* argv[])
{ //初始化临界区
InitializeCriticalSection( &g_cs );
Create( );
//删除临界区
DeleteCriticalSection( &g_cs );
return 0;
}