先看这两段代码:代码段1:constintrow=10240;constintcol=10240;intmatrix[row][col];intTestRow(){//逐行遍历intsum_row=0;for(intr=0;rx;//字符a[128];std::atomicy;};voidTest(){点点;std::threadt1([](Point*point){for(inti=0;i<100000000;++i){point->x+=1;}},&point);std::threadt2([](Point*point){for(inti=0;i<100000000;++i){point->y+=1;}},&point);t1.join();t2.join();}代码段2:structPoint{std::atomicx;字符[128];std::atomicy;};voidTest(){点点;std::threadt1([](Point*point){for(inti=0;i<100000000;++i){point->x+=1;}},&point);std::threadt2([](Point*point){for(inti=0;i<100000000;++i){point->y+=1;}},&观点);t1.join();t2.join();}两端代码的核心逻辑是对Point结构体中的x和y连续+1。唯一不同的是,中间的数组里塞了128个字节。它们的执行速度差异很大。带有128的代码比没有128的代码快得多。为什么?看过我上面文章的同学应该知道,每个CPU都有自己的L1和L2Cache,Cacheline的大小一般为64字节。如果x和y之间没有128字节的填充,它们将在同一个缓存行上。代码中开启了两个线程,这两个线程很可能会运行在不同的CPU上,每个CPU都有自己的Cache。CPU1在操作x的时候,会把y加载到Cache中,其他CPU对应的Cacheline会失效。然后CPU2加载y,会触发CacheMiss,然后将x加载到自己的Cache中,其他CPU对应的Cacheline失效。然后CPU1在操作x的时候,又触发了CacheMiss。他们两个会是一般流程:频繁触发CacheMiss,导致程序性能相当差。而如果在x和y之间加128字节的padding,x和y不在同一个Cacheline上,之前不同的CPU也不会影响。两者都会频繁的命中自己的Cache,整个程序的性能会很高。这就是传说中的FalseSharing问题。所以我们在写代码的时候,可以基于此进行深入的思考。如果我们写单线程程序,最好保证访问的数据可以相邻。在一条Cache线上,我们可以尽可能的命中Cache。如果写多线程程序,最好保证访问的数据是有间隔的,不在同一个Cacheline上,减少FalseSharing的频率。以上内容来自上一段的技术分享。完整PPT在优质C++学习圈。让我们一起学习C++。