临界区:
适用范围:它只能同步一个进程中的线程,不能跨进程同步。一般用它来做单个进程内的代码快同步,效率比较高。
相关结构:CRITICAL_SECTION_critical
相关方法:
InitializeCriticalSection(& _critical)
/*初始化,最先调用的函数。没什么好说的,一般windows编程都有类似初始化的方法*/
DeleteCriticalSection(& _critical)
/*释放资源,确定不使用_critical时调用,一般在程序退出的时候调用。如果以后还要用_critical,则要重新调用InitializeCriticalSection
*/
EnterCriticalSection(& _critical)
/*
把代码保护起来。调用此函数后,他以后的资源其他线程就不能访问了。
*/
LeaveCriticalSection(& _critical)
/*
离开临界区,表示其他线程能够进来了。注意EnterCritical和LeaveCrticalSection必须是成对出现的!当然除非你是想故意死锁!
*/
代码:
#include "stdafx.h"
int thread_count = 0;
CRITICAL_SECTION g_cs;
DWORD CALLBACK thread_proc(LPVOID params)
{
int i = 0;
char c = 'A';
for(i = 0; i < 10; ++i)
{
EnterCriticalSection(&g_cs);
{
for(c = 'A'; c <= 'Z'; ++c)
{
printf("%c",c);
}
printf("\n");
}
LeaveCriticalSection(&g_cs);
}
thread_count--;
return 0;
}
int main()
{
InitializeCriticalSection(&g_cs);
thread_count = 4;
CreateThread(0, 0, thread_proc, 0, 0, 0);
CreateThread(0, 0, thread_proc, 0, 0, 0);
CreateThread(0, 0, thread_proc, 0, 0, 0);
CreateThread(0, 0, thread_proc, 0, 0, 0);
while (thread_count)
Sleep(0);
getchar();
DeleteCriticalSection(&g_cs);
return 0;
}