win32多线程程序设计笔记(第四章上)
前面已经介绍了线程的创建、销毁过程,如何判断一个线程是否结束;但是撰写多线程程序的一个挑战性问题就是:如何让一个线程和另外一个线程合作。
在同一时间段会存在多个线程,当这些线程同时存取同一数据时,就会有问题。就像在超市储物品一样,来的时候物品箱是空,转身拿物品准备储的时候,发现物品箱已被占用了。这时,物品箱就是我所说的同一数据,人指的就是线程了。
线程之间的协调工作由同步机制来完成。同步机制相当于线程之间的红绿灯系统,负责给某个线程绿灯而给其他线程红灯进行等待。
注:对同步(synchronous)和异步进行一个说明,所谓的同步:当程序1调用程序2时,程序1停下不动,直到程序2完成回到程序1来,程序1才继续下去。
Win32 API中SendMessage()就是同步行为,而PostMessage()就是异步行为。
现在,看看第一个同步机制。
一、Critical Sections(临界区域、关键区域)
主要操作有:
InitializeCriticalSection
EnterCriticalSection
LeaveCriticalSection
DeleteCriticalSection
通过一个例子说明:
HANDLE hBoxKey;DWORD WINAPI ThreadFun(LPVOID n){ //进入关键区域(情景:关上物品箱,拨下钥匙) WaitForSingleObject ( hMutex,INFINITE ); // //处理一些不可分割的操作。。。。。 //(情景:转身拿物品,储物品,去购物。。。。) //离开关键区域(情景:打开物品箱,拿出储存的物品,插上钥匙) ReleaseMutex ( hMutex ); //} void main(){ //初始化全局锁(情景:生成物品箱的钥匙 ) hBoxKey = CreateMutex( NULL,FALSE,NULL ); //产生两个线程(情景:准备两个人抢一个物品箱 ) HANDLE hMan1 = CreateThread(NULL,0,ThreadFun, ……); HANDLE hMan2 = CreateThread(NULL,0,ThreadFun, ……); CloseHandle(hMan1); CloseHandle(hMan2); //删除全局锁(情景:删除物品箱的钥匙 ) CloseHandle( hBoxKey ) ;}