为什么多线程编程这样难呢?你有莫得想过这个问题。 一边又一边 周末了,好意思好意思的睡个懒觉起来作念早饭,作念饭其实很浮浅,照着菜谱一步步来就行,没什么难度。 在你作念饭时一霎手机铃声大作,本来是线上出现了故障,其它共事正在排查,需要你协助一下,一边作念饭一边打电话应该也不算太难,你不错的。 耿介你一边排查问题一边作念饭时本来约好翌日来维修空调的师父因为合营不开提前一天来了,你不得不一边作念饭一边排查问题一边告诉维修师父哪个空调坏了、问题是啥。。怎么样,是不是开动搪塞不外来了? 这还不算啥,就在这时你约好的同学也到了,一边接待同学一边引导着维修师父一边排查问题一边作念早饭,你是不是还是开动疯了。 当多线程际遇分享 看到了吧,"多线程"毫不是在编程这个层面很难,多线程自己就很难。 尤其是当多线程遇上分享数据时更是难上加难,对东说念主类来说,同期作念两件互不打扰的事情如故有可能的,一边写代码一边听歌即是,但你不错试试让两个任务分享听的才智,同期听两首歌;概略让两个任务分享大脑的念念考才智,一边解bug一边刷算法,你还能粗拙加答允吗? 如若你试图推演多线程拜谒分享数据那么你的脑海很可能就像刚才提到的“一边接待同学一边引导这维修师父一边排查问题一边作念早饭”,一团糟。。东说念主类的大脑似乎天生就不是很擅长(天才不在此究诘畛域),更无谓说因处理分享数据而带来的死锁等问题。 遇事未定量子力学 你的多线程代码可能在99.99%的情况下使命曩昔,但在小概率下即是会有问题,这皆不算啥,问题是你该怎么debug呢? 你该怎么调试一个可能只消万分之一出错的规律呢?何况更棒的是,就像测不准旨趣通常,测量这操作自己尽然弗成幸免的侵扰了被测量粒子的通顺状况,因此产生概略情趣。 当你试图用调试器attach上去又概略加一些log时这自己也会调动多线程规律的行径,概略问题就此不再产生,又概略概率变为了十万分之一,从这个角度看多线程和量子力学有不约而同之妙。 这里的根源在于“可能性的组合爆炸”问题。 由于操作系统的调理、系统中断再加上规律员添加的锁等原因,咱们的规律(线程)老是走走停停,这就导致在规律的“实际空间”上有太多可能,试图去测试每一种可能险些是弗成能的事情,而咱们添加一些log等自己就给本来还是爆炸的组合新增一个维度,导致有的问题相等难复现。 尽管咱们的调试用具IDE等越来越高等,但依然处理不了多线程自己的问题。 性能是个问题 如若你不热心规律性能的话,大不错加上一个很粗野的锁,但锁也不应该加的过分放飞自我,你能联想为了让北京的某个同学买一册书电商要把统共华北地区的库存锁住吗? 如若你热心地能的话那么锁的粒度会是个问题,同期在硬件级别你可能需要了解多核cache一致性以及memory ordering等,这些皆不是那么容易默契,更无谓提无锁编程,lock-free等等。 |