Git Product home page Git Product logo

Comments (7)

hyper0x avatar hyper0x commented on August 15, 2024

引用链能达到的对象就肯定不会被回收。

from example.v2.

hyper0x avatar hyper0x commented on August 15, 2024

from example.v2.

summerKK avatar summerKK commented on August 15, 2024

你好, 在有锁保护的情况下,你这么做当然是没问题的,而且更好。但是我在这里恰恰是为了演示无锁操作(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里面的节点不被别的goroutine Delete掉呢?还有保证breakpoint不会被其他的goroutine Delete掉呢?

from example.v2.

hyper0x avatar hyper0x commented on August 15, 2024

from example.v2.

hyper0x avatar hyper0x commented on August 15, 2024

from example.v2.

summerKK avatar summerKK commented on August 15, 2024

所以说,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.

hyper0x avatar hyper0x commented on August 15, 2024

from example.v2.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.