一、IRIW问题的引入在前面反复分析过内存序但仍然会有小伙伴可能会想既然最强的能解决所有问题为什么不使用最强的。比如X86平台松散的relaxed理解但那个acq_rel和seq_cst都那么接近了为什么还要分出一个acq_rel它们的应用场景到底有什么具体的不同呢这就不得不提到IRIW问题。二、IRIW问题IRIWIndependent Readers, Independent Writers即独立读独立写入。它是并发编程中的内存模型测试的一个经典的场景。主要用来检测多处理器系统中内存模型的强弱情况。它能够检验在不同处理器核心上进行读操作时是否会对两个不同位置的内存写入顺序保持一致。它是acq_rel失效测试的一个经典的反例。明白了它也就明白了上面提出的问题。三、分析IRIW发生于多线程环境中当设定的内存序为acquire-release时不同的线程对多个独立原子变量进行读写操作时可能出现不同线程对不同原子变量的观察顺序不一致的现象。下面看一个具体的例子假设有四个并发线程T1,T2,T3和T4有两个共享原子变量x,y其初始值为0。其中T1线程对x写入1T2线程对y写入1T3线程先读取x再读取y即r1x,r2yT4线程先读取y再读取x即r3y,r4x在这种情况T3和T4读取的结果会是什么情况有没有可能出现下列情况线程T3中的r1 1,r2 0;即x的写入被看到但y的写入未看到。线程T4中的r3 1,r4 0;即y的写入被看到但x的写入未看到。从结果来看这种情况是完全相反的结果。这就会导致在多线程开发环境中数据结果的不一致进而产生各种问题。其实对于内存序为acquire-release它只能保证对单个原子变量操作时的顺序对多个则无法保证。也就是说如果发生了上面的结果那么就产生了IRIW问题或者说IRIW的重排序问题。出现IRIW的问题本质的原因在于内存模型的设定C的内存模型允许不同的原子变量在操作上存在着相对独立的执行顺序编译器乱序等目的只有一个提高性能。不能因为过强的顺序一致性导致CPU执行的流水被打断。C的内存模型也是如此它引入了乱序执行来提高流水线的执行效率但这也导致在acq_rel的内存序下多原子变量的约束风险。所以在这种情况下如果引入seq_cst强制所有线程对所有的原子变量操作进行全局的排序虽然性能降低了但结果保持了一致。说的直白一些通过上面的例子和分析就可以更明显的体会C设计者如何在性能与数据一致性作出的努力。四、说明IRIW问题说明可以看作是对内存模型强弱的一种测试方式。正如前面所讲在X86平台上由于强顺序一致性的设定IRIW问题是可以被忽略的。这其实也是大多数开发者忽略这个问题的一个主要原因。但在其它一些平台上如ARM或PowerPC上它们是很有可能出现IRIW问题的这其实也是此类平台为追求性能所作出的一些取舍。弄明白IRIW问题对真正想理解高并发编程的开发者来说是一个非常好的实验场景可以让开发者能够把并发和底层控制具象化的统一起来。从而更好的理解和认识并发编程的底层机制和上层影响。五、总结IRIW问题是一种经典的区分C内存模型中seq_cst和acq_rel内存序的例子。从这个问题中可以让开发者清晰的理解并发编程中C为追求性能与安全的平衡所进行的不同粒度的底层控制。它给所有开发者提醒高并发编程不是一个简单的问题。