四线程顺序一致性示例在缓存一致性系统中的合理性探讨
Acquire/Release 与顺序一致性的疑问及示例辨析
四线程示例的争议点
有一个常见的四线程示例(来自技术博客及cppreference)常被用来讲解内存序:
T1: x = 1; T2: y = 1; T3: if( x == 1 && y == 0 ) print( "x first" ); T4: if( y == 1 && x == 0 ) print( "y first" );
这个示例的常见结论是:必须使用memory_order_seq_cst才能避免两条消息同时打印,仅靠memory_order_acquire读操作和memory_order_release写操作做不到这一点。
但这里存在疑问:如果系统具备缓存一致性,使用acquire/release内存序时,怎么会出现两条消息同时打印的情况?甚至可以进一步认为,写操作采用memory_order_relaxed即可,只要每个线程的首次读操作使用acquire就能保证读取顺序。毕竟要让两条消息同时打印,缓存需要给线程提供比之前给其他线程更旧的值,而缓存一致性规则是不允许这种情况发生的。
核心问题:假设系统存在缓存一致性,这个四线程示例是否不适合用来演示顺序一致性?
更易理解的替代示例
有一个两线程示例更适合讲解相关概念,它更容易理解且不受缓存一致性的影响:
T1: x = 1; if( y == 0 ) print( "x first" ); T2: y = 1; if( x == 0 ) print( "y first" );
内容的提问来源于stack exchange,提问作者relatively_random
相关产品推荐
相关产品推荐

