From 3219937053bad0cafef2530ee236d3b9c1d996e3 Mon Sep 17 00:00:00 2001 From: Jerry Wang Date: Wed, 31 Aug 2022 12:50:26 +0800 Subject: [PATCH] chore(advance): Optimize 'src/advance/concurrency-with-threads/sync2.md' --- src/advance/concurrency-with-threads/sync2.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/advance/concurrency-with-threads/sync2.md b/src/advance/concurrency-with-threads/sync2.md index bb91c00a..1d75f2fa 100644 --- a/src/advance/concurrency-with-threads/sync2.md +++ b/src/advance/concurrency-with-threads/sync2.md @@ -271,6 +271,10 @@ fn main() { } ``` +线程`producer`和`consumer`如果不设置`内存屏障`,那么`DATA`的值可能由于`CPU 缓存导致内存顺序的改变` +举个例子,假如`reset`中将`DATA = 0`,此时,`producer`线程中将`DATA = 100`,但由于`CPU 缓存`的原因,`DATA = 100`还没有被同步到其它`CPU 缓存`中, +此时`consumer`线程中开始读取`DATA`,结果读到了值`0`,这也就造成了`断言失败`,因此这种情况下`内存屏障`是很有必要的 + 原则上,`Acquire`用于读取,而`Release`用于写入。但是由于有些原子操作同时拥有读取和写入的功能,此时就需要使用`AcqRel`来设置内存顺序了。在内存屏障中被写入的数据,都可以被其它线程读取到,不会有 CPU 缓存的问题。 **内存顺序的选择**