美文网首页
golang:使用channel实现互斥锁

golang:使用channel实现互斥锁

作者: 程序员饭饭 | 来源:发表于2018-03-16 20:10 被阅读0次

    golang中使用channel实现互斥锁

    通过将带有一个缓冲区的channel作为一个桶,桶中的数据作为锁,每次要访问临界区的goroutine要首先拿到桶里的锁,以此来达到同步访问。

    package main
    
    import (
        "fmt"
        "runtime"
        "sync"
    )
    
    var counter int
    
    type Lock struct {
        ch chan struct{}
    }
    
    func NewLock() *Lock {
        return &Lock{
            ch: make(chan struct{}, 1),
        }
    }
    
    func (t *Lock) Lock() {
        <-t.ch
    }
    
    func (t *Lock) Unlock() {
        t.ch <- struct{}{}
    }
    
    func add(n int) {
        tmp := counter
        tmp += n
        counter = tmp
    
    }
    
    func main() {
        wg := sync.WaitGroup{}
        wg.Add(100000)
        t := NewLock()
        t.ch <- struct{}{}
    
        for i := 0; i < 100000; i++ {
            go func(j int) {
                t.Lock()
                defer t.Unlock()
                add(j)
                wg.Done()
            }(i)
        }
    
        wg.Wait()
        fmt.Println(runtime.NumGoroutine())
        fmt.Println(counter)
    }
    

    相关文章

      网友评论

          本文标题:golang:使用channel实现互斥锁

          本文链接:https://www.haomeiwen.com/subject/ckmrqftx.html