美文网首页
两把互斥锁实现waitGroup功能

两把互斥锁实现waitGroup功能

作者: funcx | 来源:发表于2021-01-23 11:59 被阅读0次
package main

import (
    "log"
    "sync"
)

type Counter struct {
    count     int
    mu1       sync.Mutex
    mu2       sync.Mutex
    needLock2 bool
}

func NewCounter(initValue int) *Counter {
    c := &Counter{count: initValue}
    if initValue != 0 {
        c.mu2.Lock()
    }
    return c
}

func (counter *Counter) Add(v int) {
    if v == 0 {
        return
    }
    counter.mu1.Lock()
    counter.count += v
    if counter.count != 0 && counter.needLock2 {
        counter.mu2.Lock()
        counter.needLock2 = false
    } else if counter.count == 0 {
        counter.mu2.Unlock()
        counter.needLock2 = true
    }
    log.Println("current value:", counter.count)
    counter.mu1.Unlock()
}

func (counter *Counter) Wait() {
    counter.mu2.Lock()
    counter.mu2.Unlock()
    log.Println("wait成功")
}

func main() {
    //counter := NewCounter(200)
    //wg := sync.WaitGroup{}
    for i := 0; i < 100; i++ {
        go func() {}()
    }
}

相关文章

  • 两把互斥锁实现waitGroup功能

  • Go 并发模式

    1. 共享内存 2. 互斥锁 3. 无缓冲channel 4. 带缓冲channel 5. sync.WaitGroup

  • 线程锁

    1.常见的锁包括:互斥锁,自旋锁。 2.互斥锁是指锁的类型,自旋锁是指锁的实现方式。 3.互斥锁:当上...

  • 5、ReentrantLock

    ReentrantLock 是 java并发包下互斥锁,功能和synchronized差不多。但是他们的实现原理有...

  • Golang标准库——sync

    sync sync包提供了基本的同步基元,如互斥锁。除了Once和WaitGroup类型,大部分都是适用于低水平程...

  • sync

    sync包提供了基本的同步基元,如互斥锁。除了Once和WaitGroup类型,大部分都是适用于低水平程序线程,高...

  • iOS锁

    锁的作用:保证线程安全。锁的分类:互斥锁,自旋锁,其它比如条件锁,递归锁,信号量都是上层的封装和实现。 互斥锁 防...

  • 用好工作池 WaitGroup

    本节学习 WaitGroup的用法 如何实现工作池 WaitGroup的用法 WaitGroup 用于实现工作池,...

  • 自旋锁和互斥锁的区别

    自旋锁是一种互斥锁的实现方式而已,相比一般的互斥锁会在等待期间放弃cpu,自旋锁(spinlock)则是不断循环并...

  • 自旋锁互斥锁区别

    自旋锁是一种互斥锁的实现方式而已,相比一般的互斥锁会在等待期间放弃cpu,自旋锁(spinlock)则是不断循环并...

网友评论

      本文标题:两把互斥锁实现waitGroup功能

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