webrtc 多线程中创建CreateDataChannel,在创建过程中闪退!
来源:互联网 发布:服务器同步备份软件 编辑:程序博客网 时间:2024/06/18 06:30
因为要做一个多线程p2p文件发送的任务,所以打算在线程中的线程函数中直接new一个p2p环境、连接turnserver服务器,照如此做,结果在CreateDataChannel的过程当中直接闪退,莫名其妙!调试发现在这个过程中peerconnectionfactory创建的signalthread和workthread通过post的方式给目标线程发送消息的时候,其消息无法进入到MessageQueue中响应,发现是因为P2P环境是在主线程的子线程中创建的,而这子线程是detach方式运行,这就导致当创建p2p环境的线程结束的时候,peerconnectionfactory中的signalthread和workthread还在运行, 可是父线程已经结束,销毁了栈中的资源,这就会导致很多非堆上的数据对象被销毁无法发挥原来的功能!找到问题后尝试把创建P2P环境的操作放到线程函数外面,连接turnserver等功能操作放在线程函数中!问题解决。
------------------------------------------------------------------------------
在后面的工作中遇到了另外的问题,就是当我在本端A运行p2p文件传输的应用的时候,在另外一台主机B上同样也运行此应用,双方进行p2p连接,连接成功后,我强行关闭两端中的一端B,该端应用马上崩溃,另外一端A因为再也无法连接到关闭的那一端了,所以日志打印上显示一直在尝试重连,可是过不多久,A端的机子就会崩溃,中断提示“this->m_mutex-> 是 0xDDDDDDDD”,这很明显是指针的重复销毁的问题,后来细查发现我在监测本端和对端的连接状态的时候做了特殊的处理,当本端监测到和对端的连接是失败的时候,自己会主动销毁自己在本端建立的peerconnection连接,可是本端之所以获知到本端和对端的连接状态,完全是因为webrtc底层的处理,实际上webrtc底层监测本端和对端的连接状态完全是多线程异步的,这样如果由其触发的断线处理函数中删除本端建立的连接,如果没有进行线程间的互斥、锁处理,很有可能造成在使用某变量的时候,该变量同时正被销毁为NULL的情况,所以应该避免在多线程异步触发的函数中不经过互斥、同步的处理即进行资源的销毁。
- webrtc 多线程中创建CreateDataChannel,在创建过程中闪退!
- 在VB中创建多线程
- webrtc在移动端:Android, IOS上的视频编码器创建过程
- 在存储过程中创建临时表
- 在存储过程中创建视图
- 在MyBatis中 SqlSessionFactory的创建过程
- SQLserver 在存储过程中创建函数,创建视图
- VB中创建多线程
- MFC中创建多线程
- Java中创建多线程
- MFC中创建多线程
- Sql server中在存储过程中创建视图
- 在iOS中创建多线程都有哪些方法?
- 在ORACLE存储过程中创建临时表
- 如何创建oracle存储过程及在jsp中调用
- 在ORACLE存储过程中创建临时表
- 在mysql中创建和调试存储过程
- 在myeclipse中创建和部署servlet的过程
- Tensorflow实现逻辑回归模型
- MonoDevelop折叠代码快捷键
- javaScript模块化编程
- CC2540蓝牙协议栈开发简介
- MySql 中 case when then else end 的用法
- webrtc 多线程中创建CreateDataChannel,在创建过程中闪退!
- 单选按钮组的操作,点击某个单选按钮操作底下相关组件,使其禁用或者允许
- win10+vs2013+cuda7.5环境搭建
- P1478 陶陶摘苹果(升级版)
- Looper.prepare()和Looper.loop()详解
- MacOS之safari无法显示图片
- ORACLE DATABASE 11G RAC 知识图文详细教程之集群概念介绍(一)
- 第六章 异常 try-catch-finally 6.2.3
- jhipster整合mybatis