您从一个因多线程不良而几乎/实际上失败的项目中学到了什么?
有时,框架会采用某种线程模型,使事情难以正确处理一个数量级。
对于我来说,我还没有从上一次失败中恢复过来,我觉得最好不要在该框架中处理与多线程有关的任何事情。
我发现我擅长处理多线程问题,这些问题具有简单的fork / join,并且数据仅在一个方向上传播(而信号可以在圆形方向上传播)。
我无法处理GUI,其中某些工作只能在严格序列化的线程(“主线程”)上完成,而其他工作只能在除主线程(“工作线程”)之外的任何线程上完成,并且数据和消息必须在N个组件之间完全传播(完整连接的图表)。
在我将该项目移交给另一个项目时,到处都有僵局问题。我听说2-3个月后,其他几位开发人员设法解决了所有僵局问题,以至于可以将其交付给客户。我从未设法找出我所缺少的知识。
关于项目的一些事情:消息ID(描述事件含义的整数值,可以将其发送到另一个对象的消息队列中,而与线程无关,而已)达到数千。唯一字符串(用户消息)也有大约一千。
添加
我从另一个团队得到的最好的类比(与我的过去或现在的项目无关)是“将数据放入数据库”。(“数据库”指的是集中化和原子更新。)在分为多个视图且全部在同一“主线程”上运行且所有非GUI繁重工作都在单个工作线程中完成的GUI中,应用程序的数据应可以将其存储在一个像数据库一样的单一文件中,并让“数据库”处理涉及非平凡数据依赖项的所有“原子更新”。GUI的所有其他部分仅处理屏幕绘图,而没有其他内容。UI部分可能会缓存内容,并且如果设计正确,用户将不会注意到它是否过时了不到一秒钟。此“数据库”也称为“文档” 在文档视图体系结构中。不幸的是-不,我的应用程序实际上将所有数据存储在“视图”中。我不知道为什么会这样。
会员贡献者:
(贡献者不需要使用真实/个人示例。如果您自己认为可信的轶事示例,也欢迎他们提供经验教训。)