webrtc的锁
2015-11-03 09:43
253 查看
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变量的析构函数还是会被正常调用的。
这种可能会对我们经常资源管理出现问题有些帮助。
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变量的析构函数还是会被正常调用的。
这种可能会对我们经常资源管理出现问题有些帮助。
相关文章推荐
- 2015(2016届)校园招聘季——中兴 篇
- PM 周刊第 2 期 2015-10-26
- 【Unity游戏开发之十一】基于NGUI的表情图文混排解决方案
- 浅谈如何辨别程序员的水平高低
- C# API 大全(简版)
- 学佛人的魄力和勇气
- NSMutableAttributedStrings - objectAtIndex:effectiveRange:: Out of bounds错误解决
- 数字IC设计经典书籍
- 枚举,函数
- 如何进行文件IO操作
- Jmockit 的使用简单介绍
- 前端开发者都应知道的 jQuery 小技巧
- 网络部分(iOS)
- SOM 工具箱简易入门
- 获取网卡的地址
- 练习!!输入学生信息
- [转]SIP穿越NAT&FireWall解决方案
- 【Unity3D游戏开发】NGUI制作字体的三种方法 (二一)
- Virtualbox ubuntu & windows 共享文件
- java程序内存体现