Comments (7)
引用链能达到的对象就肯定不会被回收。
from example.v2.
from example.v2.
你好, 在有锁保护的情况下,你这么做当然是没问题的,而且更好。但是我在这里恰恰是为了演示无锁操作(lock == nil),我在书里也说了,这个实现会尽可能的少用锁,以达到更高的性能。你可以想想为什么我这样设计可以实现有效的无锁操作。 另外,如果有锁和无锁的情况出现的概率差不多的话,你可以再写两个私有的delete方法,一个专做有锁的删除,另一个专做无锁的删除,然后让这个Delete方法在不同情况下分别调用这两个私有方法。 在 2020年4月24日 +0800 16:00,猫粮s. [email protected],写道:
…
• > 老师您好,在cmap里面bucket的Delete方法是否可以简化一下 .我们可以直接记录删除要删除节点的pre节点和next节点.把pre.next = next节点 • > 书里面的示例代码: func (b *bucket) Delete(key string, lock sync.Locker) bool { if lock != nil { lock.Lock() defer lock.Unlock() } firstPair := b.GetFirstPair() if firstPair == nil { return false } var prevPairs []Pair var target Pair var breakpoint Pair for v := firstPair; v != nil; v = v.Next() { if v.Key() == key { target = v breakpoint = v.Next() break } prevPairs = append(prevPairs, v) } if target == nil { return false } newFirstPair := breakpoint for i := len(prevPairs) - 1; i >= 0; i-- { pairCopy := prevPairs[i].Copy() pairCopy.SetNext(newFirstPair) newFirstPair = pairCopy } if newFirstPair != nil { b.firstValue.Store(newFirstPair) } else { b.firstValue.Store(placeholder) } atomic.AddUint64(&b.size, ^uint64(0)) return true } • 我实现的代码 func (b *bucket) Delete(key string, locker sync.Locker) bool { if locker != nil { locker.Lock() defer locker.Unlock() } firstPair := b.GetFirstPair() if firstPair == nil { return false } var prePair IPair var target IPair var nextPair IPair for v := firstPair; v != nil; v = v.Next() { if v.Key() == key { target = v nextPair = v.Next() break } prePair = v } if target == nil { return false } // bucket只存在一个元素 if prePair == nil { b.firstValue.Store(placeholder) } else { prePair.SetNext(nextPair) } atomic.AddUint64(&b.size, ^uint64(0)) return true } — You are receiving this because you modified the open/close state. Reply to this email directly, view it on GitHub, or unsubscribe.
- 非常感谢老师的耐心回答,之前我一直忽略了无锁状态下的情况😂.
- 现在又有一个新问题.如果在无锁状态下怎么保证
prevPairs
里面的节点不被别的goroutineDelete
掉呢?还有保证breakpoint
不会被其他的goroutineDelete
掉呢?
from example.v2.
from example.v2.
from example.v2.
所以说,CoW可以很好的解决读-读并发和读-写并发的问题,而无法解决写-写并发的问题(删也算是一种写)。 在 2020年4月28日 +0800 22:26,Robert Hao [email protected],写道:
…
你可以去看一下CoW(写时复制)的理论或者我书里的内容。在bucket里我会适时地对链表做分叉和复制,只有表头的存取需要原子操作。所有在高并发情况下,会同时出现多个链表,而这些链表之间又有交织。原则上,哪个表头最后被存入,就以哪个为准。在高并发的情况下,如果完全无锁时有可能产生混乱的,所以我在segment里加了锁。 在 2020年4月25日 +0800 16:36,猫粮s. @.>,写道: > > 你好, 在有锁保护的情况下,你这么做当然是没问题的,而且更好。但是我在这里恰恰是为了演示无锁操作(lock == nil),我在书里也说了,这个实现会尽可能的少用锁,以达到更高的性能。你可以想想为什么我这样设计可以实现有效的无锁操作。 另外,如果有锁和无锁的情况出现的概率差不多的话,你可以再写两个私有的delete方法,一个专做有锁的删除,另一个专做无锁的删除,然后让这个Delete方法在不同情况下分别调用这两个私有方法。 在 2020年4月24日 +0800 16:00,猫粮s. @.,写道: > > … > > • > 老师您好,在cmap里面bucket的Delete方法是否可以简化一下 .我们可以直接记录删除要删除节点的pre节点和next节点.把pre.next = next节点 • > 书里面的示例代码: func (b *bucket) Delete(key string, lock sync.Locker) bool { if lock != nil { lock.Lock() defer lock.Unlock() } firstPair := b.GetFirstPair() if firstPair == nil { return false } var prevPairs []Pair var target Pair var breakpoint Pair for v := firstPair; v != nil; v = v.Next() { if v.Key() == key { target = v breakpoint = v.Next() break } prevPairs = append(prevPairs, v) } if target == nil { return false } newFirstPair := breakpoint for i := len(prevPairs) - 1; i >= 0; i-- { pairCopy := prevPairs[i].Copy() pairCopy.SetNext(newFirstPair) newFirstPair = pairCopy } if newFirstPair != nil { b.firstValue.Store(newFirstPair) } else { b.firstValue.Store(placeholder) } atomic.AddUint64(&b.size, ^uint64(0)) return true } • 我实现的代码 func (b *bucket) Delete(key string, locker sync.Locker) bool { if locker != nil { locker.Lock() defer locker.Unlock() } firstPair := b.GetFirstPair() if firstPair == nil { return false } var prePair IPair var target IPair var nextPair IPair for v := firstPair; v != nil; v = v.Next() { if v.Key() == key { target = v nextPair = v.Next() break } prePair = v } if target == nil { return false } // bucket只存在一个元素 if prePair == nil { b.firstValue.Store(placeholder) } else { prePair.SetNext(nextPair) } atomic.AddUint64(&b.size, ^uint64(0)) return true } — You are receiving this because you modified the open/close state. Reply to this email directly, view it on GitHub, or unsubscribe. > > • 非常感谢老师的耐心回答,之前我一直忽略了无锁状态下的情况😂. > • 现在又有一个新问题.如果在无锁状态下怎么保证 prevPairs里面的节点不被别的goroutine Delete掉呢?还有保证breakpoint不会被其他的goroutine Delete掉呢? > > — > You are receiving this because you modified the open/close state. > Reply to this email directly, view it on GitHub, or unsubscribe.
谢谢郝大,我去了解一下.非常感谢你的悉心指导.😁😁😁😁
from example.v2.
from example.v2.
Related Issues (20)
- 为什么会形成竞态条件! HOT 1
- 关于TestBucketGetFirstPair中 HOT 1
- 这段代码的作用是什么,难道不是"<-time.After(10*time.Millisecond)"? HOT 1
- 实测输出结果与《Go并发编程实战》给出的不一致 HOT 3
- socket server端代码疑问 HOT 1
- 存在并发的风险,可能在get的过程中有Delete和Put操作 HOT 1
- 注册器的Get方法多写了几行无用代码 HOT 1
- Why func CheckBucketStatus return nothing? HOT 1
- 微调代码,以符合 io.Read 接口定义 HOT 1
- 有一些疑问需要解答 HOT 1
- 关于第五章Cmap的bucket的Delete方法是否可以简化一下 HOT 1
- chapter 6的analyzer的Analyze()方法是否会导致内存泄露 HOT 1
- chapter3/apipe/apipe.go runCmdWithPipe()这个方法会报错 HOT 1
- 第五章,线程安全的map实现cmap这里,其实是不安全的。 HOT 1
- 5.3.6 ConcurrentArray的Set方法实现疑问 HOT 3
- 错别字
- 书中的废话太多
- golang.org/x/net
- apipe example 运行出错 HOT 3
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 example.v2.