美文网首页
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