go条件变量同步机制
2024-08-22 01:20:12
sync.Cond代表条件变量,需要配置锁才能有用
package main
import (
"fmt"
"runtime"
"sync"
"time"
)
func main() {
runtime.GOMAXPROCS(4)
testCond()
}
func testCond() {
c := sync.NewCond(&sync.Mutex{})
condition := false
go func() {
time.Sleep(time.Second * 1)
c.L.Lock() //3 获得锁
fmt.Println("[1] 变更condition状态,并发出变更通知.")
condition = true
c.Signal() //c.Broadcast() //4 唤醒阻塞的main程,但是由于锁还没有释放,main抢不到锁会继续向下执行
time.Sleep(1 * time.Second)
fmt.Println("[1] 继续后续处理.")
c.L.Unlock() //5 释放锁,main抢到锁,接着执行
}()
c.L.Lock() //1 先获得锁
fmt.Println("[2] condition..........1")
for !condition {
fmt.Println("[2] condition..........2")
//等待Cond消息通知
c.Wait() //2 阻塞main,释放锁
fmt.Println("[2] condition..........3") //6 go程释放了锁 获得锁然后继续执行
}
fmt.Println("[2] condition..........4")
c.L.Unlock() //7解锁
time.Sleep(1 * time.Second)
fmt.Println("main end...")
}
最新文章
- python 内存监控模块之memory_profiler
- oracle12c不能进入到http://localhost:5500/em的解决办法
- Models
- Linux下history命令详解---转载
- SQL重复记录查询的几种方法(转)
- jQuery.attributes源码分析(attr/prop/val/class)
- LeetCode OJ 40. Combination Sum II
- angularJS 系列(五)--controller AS 语法
- UPS电源效果及有关名词解析
- Java字符串连接最佳实践
- Linux下服务器重启
- mfc100u.dll下载和使用方法
- MAMP显示文件列表
- Spring 完成自动注入(autowire)
- [Swift]LeetCode51. N皇后 | N-Queens
- Docker:跨主机容器间通信之overlay [十五]
- js_初识js_js基本语法和数据类型
- 【转载】 Sqlserver查看数据库死锁的SQL语句
- SpringBoot-学习笔记
- JAVA进阶3