Unity 5.6 环境下,lock 关键字在特定多线程场景中会引发死锁并导致崩溃。

问题场景

在异步 socket 操作中,由于内部使用了线程池回调机制,当多个回调同时操作同一对象时,lock 关键字会概率性地触发死锁并闪退。

复现条件:服务器持续重启或 WIFI 频繁断开重连,会导致连接中断,进而使大量客户端异步任务集中调度到主线程执行。主线程通过 lock 保证线程安全(涉及文件 RpcTcpSocket.csMainThread.cs),此时闪退现象频繁出现。

解决方案

lock 替换为常规的 Mutex 来保证线程安全,替换后测试未再出现崩溃。

原因推测

异步 socket 内建的 il2cpp 线程池与 lock 关键字之间可能存在某种概率性 BUG,推测是线程池内的非递归锁发生了线程内死锁。