Unity 5.6 环境下,lock 关键字在特定多线程场景中会引发死锁并导致崩溃。
问题场景
在异步 socket 操作中,由于内部使用了线程池回调机制,当多个回调同时操作同一对象时,lock 关键字会概率性地触发死锁并闪退。
复现条件:服务器持续重启或 WIFI 频繁断开重连,会导致连接中断,进而使大量客户端异步任务集中调度到主线程执行。主线程通过 lock 保证线程安全(涉及文件 RpcTcpSocket.cs、MainThread.cs),此时闪退现象频繁出现。
解决方案
将 lock 替换为常规的 Mutex 来保证线程安全,替换后测试未再出现崩溃。
原因推测
异步 socket 内建的 il2cpp 线程池与 lock 关键字之间可能存在某种概率性 BUG,推测是线程池内的非递归锁发生了线程内死锁。