Comments (5)
大部分语言都存在多核CPU缓存不同步问题,包括Java的volatile
和C#的volatile
关键字 都是做多线程在多核CPU强制同步的。
如果没有用这个关键字,在多线程环境下,一个正在执行的线程中的变量被其他变量修改是无法同步的。
from interview-go.
@lifei6671 谢谢解答。我现在明白了。我之前认为cpu多核之间的缓存一致性协议(比如MESI协议)会同步多核缓存,不会出现多核cache中变量值不同步的情况。 现在了解到,cpu不是直接将修改写到缓存里的,而是要经过Store buffer。这样就会产生多核cache间的同步延迟,导致多核cpu缓存中的变量不同步。
from interview-go.
大部分语言都存在多核CPU缓存不同步问题,包括Java的
volatile
和C#的volatile
关键字 都是做多线程在多核CPU强制同步的。 如果没有用这个关键字,在多线程环境下,一个正在执行的线程中的变量被其他变量修改是无法同步的。
我还是没太理解,这个问题感觉应该是能实现f()只执行一次才对,只不过实现很差,因为后续
if o.done == 0 {
o.done = 1
这个操作是被锁保护的,也就是说,其他线程会等在锁外面,并且正确的被 o.done == 0 拦截掉
这里的实现方法的问题应该是
- 有大量routine等在
o.m.Lock()
这句话上面,尽管后续o.done == 0
能把他们否决出去 - 因为在f()之前把 done设置为 1 了,可能导致后续routine在 f() 执行完之前就被放过去,导致初始化未完成,这种情况下有可能出现 panic
所以2的问题官方是这么做的
defer atomic.StoreUint32(&o.done, 1)
f()
from interview-go.
这个和Java等语言出现volatile关键字没有什么联系,volatile关键字是和golang的atomic包功能一样,可以让在没有使用同步锁的时候也能并发给变量赋值和读取。但是题目里已经使用了同步锁,所以不会有问题,这个仓库没有更新,可以看下题目的原出处,在评论区作者已经讨论很清楚了原文
from interview-go.
大部分语言都存在多核CPU缓存不同步问题,包括Java的
volatile
和C#的volatile
关键字 都是做多线程在多核CPU强制同步的。 如果没有用这个关键字,在多线程环境下,一个正在执行的线程中的变量被其他变量修改是无法同步的。我还是没太理解,这个问题感觉应该是能实现f()只执行一次才对,只不过实现很差,因为后续
if o.done == 0 { o.done = 1这个操作是被锁保护的,也就是说,其他线程会等在锁外面,并且正确的被 o.done == 0 拦截掉 这里的实现方法的问题应该是
- 有大量routine等在
o.m.Lock()
这句话上面,尽管后续o.done == 0
能把他们否决出去- 因为在f()之前把 done设置为 1 了,可能导致后续routine在 f() 执行完之前就被放过去,导致初始化未完成,这种情况下有可能出现 panic
所以2的问题官方是这么做的
defer atomic.StoreUint32(&o.done, 1) f()
你的理解没有问题,我在题目作者博客看到了最后的讨论原文
from interview-go.
Related Issues (20)
- 实现 Sunday 匹配 精简版代码
- 第三题的答案是否使用了额外的空间 HOT 1
- gpm窃取过程不对 HOT 1
- 常见语法题目 一 的第6题,CAS操作 HOT 3
- 一些建议 HOT 4
- 语法找错题 最后一道解答错误
- question17/多协程切片查询
- 最长公共前缀 go版本代码有误
- 第六题机器人坐标计算有问题
- 冒泡排序完全是错的 HOT 1
- “实现阻塞读且并发安全的map”答案补充 HOT 1
- q001中的chan类型应该用struct{}
- 实现 Sunday 匹配 needle在最末尾的时候返回结果异常
- 读阻塞且并发安全的 Map,答案是否有问题?
- 最接近的三数之和,代码有误
- Goroutine泄露问题——交替打印数字和字母
- q006 机器人坐标,L 跟 R指令是不是调转了
- 判断字符串中字符是否全都不同为什么有个127的判断?
- 『goroutine和channel使用一』 答案协程泄露
- interview-go/question /q015.md
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from interview-go.