忆困血馆闻 发表于 2024-3-4 09:34:25

关于易语言多线程的稳定性/冲突/崩溃/解决办法汇总

写多线程程序,一旦遇到线程访问冲突和软件崩溃的问题,就变得非常难以调试和解决,网络上给出的解释是,“一个线程想要访问该资源,另一个线程却要改变该资源”,就可能会出现各种各样的问题,而且在数据量或者是线程数目和总线程数目较少的情况下,难以察觉,但是100个线程同时运行且运行时间一长,软件往往就会崩溃掉。

下面是易语言多线程的稳定性解决一些新领悟。

易语言也是支持线程池、读写锁、信号量、Event事件、临界区的、原子锁。

原子锁对一个全局变量或者程序集变量赋值,会大大提高效率。弄明白临界区之后,我基本上都不用易语言的许可证了,因为闲麻烦。

再一个非官方的支持库里面的很多命令,在多线程中总是出现各种各样的问题,所以还是把自己常用的代码,直接封装成一个模块,自己使用吧,毕竟自己写的东西,自己最明白。

下面的是我一年以前的观点了,现在很多观念发生了变化,所以修改了一下。

---------------------------------------------

    最近,angelc0de也遇到了这个难题,在网络上搜索了基本上所有关于解决易语言多线程冲突的办法,有些办法也是我之前没有预料到的,现在挑选几项常见错误给大家汇总一下(注,以下只是个人讲解,angelc0de本人并不能保证以前的观点全部正确,但是至少会给大家一些有用的参考)。

1、在多线程中尽量避免对可视化组件的频繁操作,多线程中对编辑框、超级列表框等等赋值时,一定要加临界区限制,但是取值应该不用吧,至少我是这样认为的。

2、尽量少用网上的一些朋友写的多线程模块,如果非要用,用那些论坛上级别高的会员发布的模块吧。尽量使用易语言官网的2012年8月7号的最新版多线程支持库,要比其他的所谓的多线程模块稳定的多。

3、易语言核心支持库以外的一些命令本身就不支持多线程。网友总结如:编码转换类的模块、读写配置项()命令、取现行时间()等等。

4、可以使用 标签反馈事件,这个命令在多线程中非常稳定,但是软件可能会比较卡,angelc0de本人没有测试过这个命令,闲麻烦。

5、有网友推荐把易语言多线程中的所有变量全部以数组形式出现,这种方法确实非常有效,但是会使软件耗费大量的系统资源(这个方法,angelc0de本人亲自测试过,确实非常有用,但是太麻烦了,每一个子线程中的局部变量是没有必要加线程锁的,以数组形式出现完全没有必要吧)。

6、多核CPU有可能会出现CPU亲和性问题,可以用API_SetProcessAffinityMask(-1,1)或API_SetProcessAffinityMask(-1,2)函数解决,部分网友说SetThreadIdealProcessor这个函数可能会更好(angelc0de亲自测试了这个方法,会使软件崩溃的时间推后一些,但是最终还是崩溃掉)。

7、每一个线程创建的时候,会生成一个多线程句柄,线程完毕后,尽量关闭线程句柄,这个句柄多到一定数量不关闭,句柄资源将会耗尽,在一个,使用线程句柄尽量不要频繁地终止线程,那会造成内存泄露。

8、多线程中有可能产生冲突的共享资源,前后一定要加上线程锁。

9、网络上很多多线程源码,本来是很稳定的,但是作者放到网上的时候,把关键代码做了修改。所以,有的时候还是要自己思考解决办法的。

只做一件事 发表于 2024-3-4 12:45:29

感谢分享,学习了。
页: [1]
查看完整版本: 关于易语言多线程的稳定性/冲突/崩溃/解决办法汇总