Unity C# lock关键字的坑

Wesley13
• 阅读 272

Unity 5.6 环境下的 lock关键字,在特定的多线程环境下会死锁 崩溃

其中一种情况:

异步socket 操作,由于内部是一个线程池回调的异步回调,操作同一个对象时 lock关键字会概率出现死锁 闪退,

(发现现象的例子是服务器不断重启或者WIFI断开打开,导致连接断开客户端异步任务大量要在主线程执行导致闪退,而主线程保证线程安全的是用关键字lock来处理的 (RpcTcpSocket.cs MainThread.cs))

解决方案:采用常规的Mutex 来保证线程安全 后 测试没在出现崩溃

猜想原因可能是 异步socket内建的il2cpp线程池和lock关键字相互之间有某种概率性BUG 可能池内的非递归锁 线程内死锁了

点赞
收藏
评论区
推荐文章
blmius blmius
1年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
1年前
4、jstack查看线程栈信息
1、介绍利用jps、top、jstack命令找到进程中耗时最大的线程,以及线程状态等等,同时最后还可以显示出死锁的线程查找:FoundoneJavaleveldeadlock即可1、jps获得进程号!(https://oscimg.oschina.net/oscnet/da00a309fa6
Stella981 Stella981
1年前
AsyncTask的用法
AsyncTask,即异步任务,是Android给我们提供的一个处理异步任务的类.通过此类,可以实现UI线程和后台线程进行通讯,后台线程执行异步任务,并把结果返回给UI线程..为什么需要使用异步任务?我们知道,Android中只有UI线程,也就是主线程才能进行对UI的更新操作,而其他线程是不能直接操作UI的.这样的好处是保证了UI的稳定性和准确性,避
Wesley13 Wesley13
1年前
Mysql 查看所有线程,被锁的表等
\查看所有MYSQl相关的线程\showfullprocesslist;\杀死线程id为2的线程\kill2\查看服务器状态\showstatuslike'%lock%';\查看服务器配置参数\showvariablesli
Wesley13 Wesley13
1年前
JS异步的底层原理:单线程加事件队列
异步的底层原理:单线程事件队列。js的代码执行时单线程的,所谓单线程:就是js代码时从上到下按顺序依次执行的,一次只能做一件事情。事件队列可以看作一个容器,这个容器存储着js的回调函数,只有js代码执行结束后,才会去事件队列中调用这些回调函数。例:1//以下的代码先执行for循环,再输出sum值,然后输出正常代码执行,最后
Stella981 Stella981
1年前
Event事件
07.07自我总结Event事件一.导入模块fromthreadingimportEvent二.概念线程间状态同步:即将一个任务丢到子进程中,这个任务将异步执行,如何获取到这个任务的执行状态注意:执行状态和执行结果不是同一个概念,异步回调拿到的是任务
Wesley13 Wesley13
1年前
java锁学习(一)
作用能够保证同一时刻,最多只有一个线程执行该段代码,以达到并发安全的效果主要用于同时刻对线程间对任务进行锁地位synchronized是JAVA的原生关键字,是JAVA中最基本的互斥手段,是并发编程中的元老角色不使用并发的后果不使用并发会导致多线程情况下,同一个数据被多个线程同时更改,造成结果和预期不一致
Wesley13 Wesley13
1年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Stella981 Stella981
1年前
Spring 异步调用,多线程,一行代码实现
Spring异步调用,多线程概述快速入门异步回调异步异常处理自定义执行器1、概述在日常开发中,我们的逻辑都是同步调用,顺序
Wesley13 Wesley13
1年前
Java并发编程之锁的活跃性问题
引子在安全性和活跃性之间通常存在一种制衡。当我们使用锁来保证线程的安全的同时,如果过度使用加锁,可能会导致死锁。应用无法从死锁中恢复过来,所以在设计时一定要避免会排除这些可能会出现的活跃性问题。死锁死锁描述了这样一种情景,两个或多个线程永久阻塞,互相等待对方释放资源如果线程1锁住了A,然后尝试对B进行加锁,同