今天又一次尝试编译安卓,想测试一下编译的速度如何?编程
考虑机器是4核8线程,就用上了 make -j8,感受上上速度是很快,刷屏就下来了,不过错误了,错误的提示大概是某个文件的规则没找到,想一想了多线程并发执行会不会涉及到同步的问题,因而就有了这篇。windows
尴尬的clear掉没用的东西,由于发现继续make居然从新开始了。最后用了 make -j4从新试了试,结果没有任何异常。多线程
首先,从CPU的核心数想这个问题,我用的虚拟机来编译的,分了4个核给虚拟机,发现window下cpu的占用率始终是50%上下波动。最后发现windows认为个人cpu是8核的,这就是inter cpu牛的地方吗?并发
从这里想到编程之美上的一道题目,若是让cpu使用率50%的状态,那么让半数线程满载运行也行?或者是用定时器让每一个核心以50%的时间工做在while()之下,另一半时间调用idle(),总之感受上可行,有时间不妨来试试。测试
这里就明白了一个现象,window能识别出来的核心数,和分配给虚拟机核心数之间的关系。线程
这样 make -j8 就是让8个线程让4个核心竞争的执行,(只考虑相关的线程),make -j4 就是4个线程然竞争4个核心。同步
这样同步的问题第一种状况会明显比第二种状况激烈,出错也是有很大可能的。 虚拟机
不过,应该更关注make 多线程编译怎样避免出错的问题? 首先很明显多线程能提交编译速度,可是若是不处理好依赖关系就会形成编译出错的问题。编译
若是依赖问题没有处理好,就只能单线程这样避免编译出错。若是依赖关系设置过于保守,则可能自己编译的可并行度就降低了,也不能取得最佳的效果,总之还有一个平衡的问题。定时器
最后也没找到特别合适的出错的缘由,只好归咎于多线程竞争吧