Win32 线程知识点梳理二

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(
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值