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。
文字版电子书-----请点击这里