读书人

win32多线程程序设计札记(第四章上)

发布时间: 2013-09-15 19:58:13 作者: rapoo

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 ) ;}



读书人网 >编程

热点推荐