2022.11.23 记

一个多线程的BUG,花了俩小时,虽然在处理之初,就有一个解决思路,大概就是bug 抛出的地方加一个try catch,一切万事大吉。

不过闲着也是闲着,手头上的几个事情都比较复杂,没啥动力。

同时再一次感慨,C#在BUG 调试上的极其容易追踪,和C++简直不可同日而语。

分析托管代码和分析C++的时候摸不到头脑主要依靠猜测相比,就像是这边还在用冷武器,那边已经上全自动加特林

以下

问题是Dictionary抛出的,Add 时提示Index 超出。

因为Dictionary 不是线程安全的,所以在跨线程操作同一个对象的时候,有可能产生冲突。 在操作的时候加锁就可以解决。

以下

得益于VS的强大和C#的方便性,在调试里面有一个源代码选项,开启后,可以

开启source link。

得益于此,看了一下Dictionary在C#中的实现,找到了报错的那一行源代码,以及当时的对象状态,

Key 被一个线程移除了,但是在这个另一个线程中,key则正在被操作,于是崩溃了。

如果这里改用线程安全的函数也可以,不一定要加锁,或者是重写key添加的时候,不做自身的移除操作等等,都可以。