《Win32多线程程序设计》(3)---同步控制

让我先对同步(synchronous)与异步(asynchronous)做个说明。当程序1调用程序2时,程序1停下不动,直到程序2完成回到程序1来,程序1才继续下去,这就是所谓的“synchronous”。如果程序1调用程序2后,径自继 续自己的下一个动作,那么两者之间就是所谓的“asynchronous”。

Win32 API中的SendMessage() 就是同步行为,而PostMessage() 就是异步行为。

在Window s 系统中,PostMessage() 是把消息放到对方的消息队列中,然后不管三七二十一,就回到原调用点继续执行,所以这是异步(asynchronous)行为。而SendMessage() 根本就像是“直接调用窗口之窗口函数”,除非等 该窗口函数结束,是不会回到原调用点的,所以它是同步(synchronous)行为。


Critical Sections(关键区域、临界区域)

Win32 之中最容易使用的一个同步机制就是critical sections 。所谓critical sections 意指一小块“用来处理一份被共享之资源”的程序代码。这里所谓的资源,并不是指来自.RES (资源文件)的Window s 资源,而是广义地指一块内存、一个数据结构、一个文件,或任何其他具有“使用之排他性”的东西。也就是说,“资源”每一次(同一时间内)只能够被一个线程处理。

你可能必须在程序的许多地方处理这一块可共享的资源。所有这些程序代码可以被同一个critical  section 保护起来。为了阻止问题发生,一次只能有一个线程获准进入critical  section 中(相对地也就是说资源受到了保护)。实施的方式是在程序中加上“进入”或“离开”critical section  的操作。如果有一个线程已经“进入”某个critical section ,另一个线程就绝对不能够进入同一个critical  section。

Critical section 并不是核心对象。因此,没有所谓handle 这样的东西。它和核心对象不同,它存在于进程的内存空间中。你不需要使用像“Create”这样的API 函数获得一个 critical section handle。你应该做的是将一个类型为CRITICAL_SECTION  的局部变量初始化,方法是调用InitializeCriticalSection():

VOID InitializeCriticalSection( 
LPCRITICAL_SECTION lpCriticalSection
); 
参数
lpCriticalSection  一个指针,指向欲被初始化的
CRITICAL_SECTION 变量。这个变量应该在你的
程序中定义。
返回值
此函数传回void。
当你用毕critical  section时,你必须调用DeleteCriticalSection() 清除它。
这个函数并没有“释放对象”的意义在里头,不要把它和C++ 的delete 运算
符混淆了。
VOID DeleteCriticalSection( 
LPCRITICAL_SECTION lpCriticalSection
); 
参数
lpCriticalSection  指向一个不再需要的CRITICAL_SECTION 变量。
返回值
此函数传回void。
一旦critical  section 被初始化,每一个线程就可以进入其中——只要它通过了EnterCriticalSection() 这一关。
VOID EnterCriticalSection(
LPCRITICAL_SECTION lpCriticalSection
);
参数
lpCriticalSection  指向一个你即将锁定的CRITICAL_SECTION 变量。
返回值
此函数传回void。
当线程准备好要离开critical  section时,它必须调用LeaveCriticalSection():
VOID LeaveCriticalSection(
LPCRITICAL_SECTION lpCriticalSection
);
参数
lpCriticalSection  指向一个你即将解除锁定的CRITICAL_SECTION 变量。
返回值
此函数传回void。


文字版电子书-----请点击这里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值