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的情况,所以应该避免在多线程异步触发的函数中不经过互斥、同步的处理即进行资源的销毁。

0 0
原创粉丝点击