Windows 临界区,内核事件,互斥量,信号量。
临界区,内核事件,互斥量,信号量,都能完成线程的同步,在这里把他们各自的函数调用,结构定义,以及适用情况做一个总结。
临界区:
适用范围:它只能同步一个进程中的线程,不能跨进程同步。一般用它来做单个进程内的代码快同步,效率比较高。
相关结构:CRITICAL_SECTION _critical
相关方法:
/*初始化,最先调用的函数。没什么好说的,一般windows编程都有类似初始化的方法*/
InitializeCriticalSection(& _critical)
/*释放资源,确定不使用_critical时调用,一般在程序退出的时候调用。如果以后还要用_critical,则要重新调用InitializeCriticalSection
*/
DeleteCriticalSection(& _critical)
/*
把代码保护起来。调用此函数后,他以后的资源其他线程就不能访问了。
*/
EnterCriticalSection(& _critical)
/*
离开临界区,表示其他线程能够进来了。注意EnterCritical和LeaveCrticalSection必须是成对出现的!当然除非你是想故意死锁!
*/
LeaveCriticalSection(& _critical)
代码Demo

#include "stdafx.h"
int thread_count = 0;
/*Mutex mutex1;*/
CRITICAL_SECTION g_cs;
DWORD CALLBACK thread_proc(LPVOID params)
{
for(int i = 0; i < 10; ++i)
{
//synchronized(mutex1)
EnterCriticalSection(&g_cs);
{
for(char c = 'A'; c <= 'Z'; ++c)
{
printf("%c",c);
}
printf("\n");
}
LeaveCriticalSection(&g_cs);
}
thread_count--;
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
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;
内核事件:
适用范围:多用于线程间的通信,可以跨进程同步。
相关结构: HANDLE hEvent;
相关方法:
/*
初始化方法,创建一个事件对象,第一个参数表示安全属性,一般情况下,遇到这类型的参数直接给空就行了,第二个参数是否是人工重置。(内核时间有两种工作模式:人工重置和自动重置。其区别会在下面提到。)。第三个参数是初始状态,第四个参数事件名称。
*/
hEvent = CreateE