webrtc的锁



 1,多线程访问同一个变量,需要加锁。
  2,锁是一种资源,需要做好加锁和解锁相对应,创建和释放相对应。

   当需要向一个消息队列(消息队列中有一个CriticalSection类型的锁)添加消息的时候,我们的通常做法如下:   
    Void MessageQueue::Add(Message* msg)   
    {   
    m_pCrit->Lock();//加锁   
    message_queues_.push_back(msg);   
    m_pCrit->UnLock();//解锁   
    }   
    这样的代码就很容易出现当push_back出现异常的时候,m_pCrit没有被解锁,导致资源有问题。   
    这仅仅是一个例子,push_back一般不会出现异常,但是不能保证我们中间可能写了很多处理代码,难免不会有异常发生。   
    一旦发生,函数如果跳出,锁资源就不会被释放了。   
   
    Webrtc采用的方案:   
    Void MessageQueue::Add(Message* msg)   
    {   
    CritScope cs(&m_pCrit);//定义一个临时变量cs,它的构造函数中负责加锁,析构函数负责解锁。   
    message_queues_.push_back(msg);   
    //函数退出的时候,cs被释放,自动调用析构函数解锁   
    }   
    采用这种方式,可以保证资源一定会被正常的释放,即使中间代码出现异常,cs变量的析构函数还是会被正常调用的。   
    这种可能会对我们经常资源管理出现问题有些帮助。   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值