Win32中sendMessage() 是同步行为,而PostMessage()是异步行为。关于进程和线程的协调工作是由同步机制来完成的。
Critical Section 临界区
它的含义是指一小块用来处理一份被共享的资源的程序代码
,这里的资源指的是广义的如一块内存、一个数据结构、一个文件或其他具有使用排他性的的东西。对资源的保护是通过允许一次仅仅一个线程进入critical section。
注意:Critical Section不是核心对象,没有所谓的handle这样的东西,它存在于进程的内存空间,你不需要使用Create这样的API函数来获得一个critical section handle。
你应该做的是对一个类型为CRITICAL_SECTION的变量初始化。调用InitializeCriticalSection
void WINAPI InitializeCriticalSection(
_Out_ LPCRITICAL_SECTION lpCriticalSection
);
参数1:1个指针,指向欲被初始化的critical_section变量
void WINAPI DeleteCriticalSection(
_Inout_ LPCRITICAL_SECTION lpCriticalSection
);
参数1:指向一个不再需要的CRITICAL_SECTION变量
void WINAPI EnterCriticalSection(
_Inout_ LPCRITICAL_SECTION lpCriticalSection
);
参数1:指向一个即将锁定的变量
当线程即将进入其中,必须通过这一关。
void WINAPI LeaveCriticalSection(
_Inout_ LPCRITICAL_SECTION lpCriticalSection
);
参数1: 指向一个即将解除锁定的变量
警告:不要在一个critical section之中调用sleep()或任何Wait…()API函数
由于critical section不是核心对象,如果进入critical section的那个线程挂掉而没有调用LeaveCriticalSection()的话,系统没有办法将该critical section清除。如果需要这样的机能,应该使用mutex。
DeadLock/ The Deadly Embrace
当双方都握有对方所需要的东西,这种情况称为死锁。
void SwapLists(List* list, List* list2){
List * tmp_list;
EnterCriticalSection(