Golang sync.NewCond条件锁的用法

package main

import (
    "fmt"
    "sync"
    "time"
)

func main() {
    c := sync.NewCond(&sync.Mutex{})
    queue := make([]interface{}, 0, 10)

    removeFromQueue := func(delay time.Duration) {
        time.Sleep(delay)
        c.L.Lock()
        queue = queue[1:]
        fmt.Println("Remove from queue")
        c.L.Unlock()
        c.Signal()
    }

    for i := 0; i < 10; i++ {
        c.L.Lock()
        for len(queue) == 2 {
            c.Wait()
        }

        fmt.Println("Adding to queue")
        queue = append(queue, struct{}{})
        go removeFromQueue(1 * time.Second)
        c.L.Unlock()
    }
}

程序输出如下,
Adding to queue
Adding to queue
Remove from queue
Adding to queue
Remove from queue
Adding to queue
Remove from queue
Adding to queue
Remove from queue
Adding to queue
Remove from queue
Adding to queue
Remove from queue
Adding to queue
Remove from queue
Adding to queue
Remove from queue
Adding to queue

原文地址:https://www.cnblogs.com/ExMan/p/12408664.html

时间: 2024-07-30 21:05:28

Golang sync.NewCond条件锁的用法的相关文章

NSConditionLock 条件锁

有时候不是简单的需要 加锁/解锁, 而是需要根据一定条件满足后进行 加锁/解锁. 以一个生产中与消费者的例子,介绍条件锁的用法. static NSInteger CONDITION_NO_DATA //条件一: 没有数据 static NSInteger CONDITION_HAS_DATA //条件二: 有数据 //初始化锁时,指定一个默认的条件 NSConditionLock *lock = [[NSConditionLock alloc] initWithCondition:CONDIT

条件锁类

#include <pthread.h> class CTestLock { public: CTestLock() { pthread_mutex_init(&mutex_t_, NULL); pthread_cond_init(&cond_t_, NULL); } ~CTestLock() { pthread_mutex_destroy(&mutex_t_); pthread_cond_destroy(&cond_t_); } int Lock() { in

递归锁+条件锁+互斥锁-04-多线程

1 // 2 // ViewController.m 3 // 05-递归锁(recursive)+条件锁(condition) 4 // 5 // Created by mac on 16/4/20. 6 // Copyright © 2016年 mac. All rights reserved. 7 // 8 /* 9 10 3). 互斥锁 11 NSLock *_lock; 12 13 3)NSLock :不能多次调用,会产生死锁 14 15 2016-04-20 16:06:44.600

条件锁

ReentrantLock类有一个方法newCondition用来生成这个锁对象的一个条件(ConditionObject)对象,它实现了Condition接口.Condition提供了线程通讯的一套机制await和signal等线程间进行通讯的方法.. 1.适用场景 当某线程获取了锁对象,但因为某些条件没有满足,需要在这个条件上等待,直到条件满足才能够往下继续执行时,就需要用到条件锁. 这种情况下,线程主动在某条件上阻塞,当其它线程发现条件发生变化时,就可以唤醒阻塞在此条件上的线程. 2.使用

MySQL锁的用法之行级锁

行级锁是MySQL中粒度最小的一种锁,他能大大减少数据库操作的冲突.但是粒度越小,实现的成本也越高.MYISAM引擎只支持表级锁,而INNODB引擎能够支持行级锁,下面的内容也是针对INNODB行级锁展开的. INNODB的行级锁有共享锁(S LOCK)和排他锁(X LOCK)两种.共享锁允许事物读一行记录,不允许任何线程对该行记录进行修改.排他锁允许当前事物删除或更新一行记录,其他线程不能操作该记录.   共享锁:    用法: SELECT ... LOCK IN SHARE MODE; M

不得不知道的golang之sync.Mutex互斥锁源码分析

针对Golang 1.9的sync.Mutex进行分析,与Golang 1.10基本一样除了将panic改为了throw之外其他的都一样.源代码位置:sync\mutex.go.可以看到注释如下: Mutex can be in 2 modes of operations: normal and starvation. In normal mode waiters are queued in FIFO order, but a woken up waiter does not own the m

zookeeper 实现分布式锁安全用法

背景 ConnectionLoss 链接丢失 SessionExpired 会话过期 绕开 zookeeper broker 进行状态通知 leader 选举与zkNode 断开 做好幂等 静态扩容.动态扩容 背景 分布式锁现在用的越来越多,通常用来协调多个并发任务.在一般的应用场景中存在一定的不安全用法,不安全用法会带来多个master在并行执行,业务或数据可能存在重复计算带来的副作用,在没有拿到lock的情况下扮演者master等诸如此类. 要想准确的拿到分布式锁,并且准确的捕获在分布式情况

golang sync.RWMutex

sync.RWMutex package main import ( "fmt" "runtime" "sync" ) func clickWithMutex(total *int, m *sync.RWMutex, ch chan int) { for i := 0; i < 1000; i++ { m.Lock() *total += 1 m.Unlock() //这里是写 下面是读,外层还有线程的竞争 if i == 500 { m.

golang sync.WaitGroup

//阻塞,直到WaitGroup中的所以过程完成. import ( "fmt" "sync" ) func wgProcess(wg *sync.WaitGroup, id int) { fmt.Printf("process:%d is going!\n", id) //if id == 2 { // return //} wg.Done() } func main() { //var wg sync.WaitGroup wg := new(