sync

在golang 文档上,golang不希望通过共享内存来进行进程间的协同操作,而是通过channel的方式来进行,当然,golang也提供了共享内存,锁等机制进行协同操作的包;

互斥锁: Mutex 和 RWMutex

var m *sync.RWMutex
m = new(sync.RWMutex)
go m.RLock()
// read var
m.Unlock()
go m.Lock()
// write var
m.Unlock()

多个goroutine都需要做一个操作,但是这个操作只需要执行一次即可,这就需要Once

var once sync.Once
for i :=0; i<10; i++{
go func(){
once.Do(func_val)
}
}

此时多个goroutine只执行一次;

WaitGroup 和Cond

一个goroutine等待其他多个goroutine执行完毕之后才能继续执行,则这种多协程等待问题需要用WaitGroup

wp := new(sync.WaitGroup)
wp.add(10)
for i:=0; i<10; i++{
go func(){
fmt.Println("Done, i=", i)
wp.Done()
}()
}
wp.Wait()

sync.Cond用来控制某个条件下,goroutine进行等待时期,等待信号,然后继续运行:

locker := new(sync.Mutex)
cond := sync.NewCond(locker)
done := false

cond.L.Lock()
go func(){
time.Sleep(2e9)
done = true
cond.Signal()
}()

if (!done){
cond.Wait()
}

//sync.BroadCast 用来通知唤醒所有等待的goroutine

var locker = new(sync.Mutex)
var cond = sync.NewCond(locker)

func test_function(i int){
cond.L.Lock()
cond.Wait()
fmt.Println("input value:", i)
cond.L.Unlock() //需要释放lock
}

for i:=0; i<10; i++{
go test_function(i)
}
cond.BroadCast()

使用channel来实现:【并发请求数据,获取最先返回的那个数据】

func Query(conns []Conn, query string) Result{
ch := make(chan Result, 1)
for _, c := range conns{
go func(c){
select {
case ch <- c.DoQuery(query):
default: //case <- timeout , 另开goroutine,进行time.Sleep(10 * time.Second),即超时
}
}(conns)
}
return <-ch
}

sync/atomic 库

sync/atomic库提供了原子 操作的支持,原子操作直接由底层CPU硬件支持;

type Value struct{
Key string
Value interface{}
}

type Noaway struct{
Movice atomic.Value
Total atomic.Value
}
func NewNoaway() *Noaway{
n := new(Noaway)
n.Movice.Store(&Value{Key: "moive", Val: "Wolf Warrior 2"})
n.Total.Store("$20000")
return n
}

func main(){
n := newNoaway()
val := n.Movies.Load().(*Value)
total := n.Total.Load().(string)
}

golang sync包的更多相关文章

  1. golang 中 sync包的 WaitGroup

    golang 中的 sync 包有一个很有用的功能,就是 WaitGroup 先说说 WaitGroup 的用途:它能够一直等到所有的 goroutine 执行完成,并且阻塞主线程的执行,直到所有的 ...

  2. go语言中sync包和channel机制

    文章转载至:https://www.bytelang.com/article/content/A4jMIFmobcA= golang中实现并发非常简单,只需在需要并发的函数前面添加关键字"Go&quo ...

  3. Golang fmt包使用小技巧

    h1 { margin-top: 0.6cm; margin-bottom: 0.58cm; direction: ltr; color: #000000; line-height: 200%; te ...

  4. Golang Vendor 包机制 及 注意事项

    现在的 Go 版本是 1.8,早在 1.5 时期,就有了 Vendor 包机制,详情可查看博文:“理解 Go 1.5 vendor”. 遇到的问题 个人在使用 Glide 管理 Vendor 包时(附 ...

  5. Golang Vendor 包管理工具 glide 使用教程

    Glide 是 Golang 的 Vendor 包管理器,方便你管理 vendor 和 verdor 包.类似 Java 的 Maven,PHP 的 Composer. Github:https:// ...

  6. golang reflect包使用解析

    golang reflect包使用解析 参考 Go反射编码 2个重要的类型 Type Value 其中Type是interface类型,Value是struct类型,意识到这一点很重要 Type和Va ...

  7. Golang测试包

    Golang测试包 golang自带了测试包(testing),直接可以进行单元测试.性能分析.输出结果验证等.简单看着官方文档试了试,总结一下: 目录结构和命令 使用golang的测试包,需要遵循简 ...

  8. golang sync.Cond 类

    众所周知,go语言在多线程方面的支持是十分完备的.在go语言sync包中提供了一个Cond类,这个类用于goroutine之间进行协作. 这个类并不复杂,只有三个函数,Broadcast() , Si ...

  9. Golang : cobra 包解析

    笔者在<Golang : cobra 包简介>一文中简要的介绍了 cobra 包及其基本的用法,本文我们从代码的角度来了解下 cobra 的核心逻辑. Command 结构体 Comman ...

随机推荐

  1. CodeForces 1117C Magic Ship (循环节+二分答案)

    <题目链接> 题目大意: 给定起点和终点,某艘船想从起点走到终点,但是海面上会周期性的刮风,船在任何时候都能够向四个方向走,或者选择不走,船的真正行走路线是船的行走和风的走向叠加的,求船从 ...

  2. poj 2528 Mayor’s posters 【离散化】+【线段树】

    <题目链接> 题目大意: 往一堵墙上贴海报,依次输出这些海报张贴的范围,这些海报能够相互覆盖,问最后能够看见几张海报? 解题分析: 由于是给出每张海报的区间,所以在这些区间内的很多点可能用 ...

  3. P2347 砝码称重-DP方案数-bitset

    P2347 砝码称重 DP做法 : 转化为 01背包. 进行方案数 更新.最后统计种类. #include<bits/stdc++.h> using namespace std; #def ...

  4. ORM(一)

    1.什么是ORM ORM,即Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作业务对象的时候,就不需要再去 ...

  5. 【DWM1000】 code 解密7一ANCHOR接收到BLINK

    接着之前ANCHOR的代码分析,但接收到无线数据,应该执行如下代码 case TA_RX_WAIT_DATA :   //already recive a message                ...

  6. [ONTAK2015]Tasowanie

    [ONTAK2015]Tasowanie 题目大意: 给你两个长度分别为\(n(n\le2\times10^5)\)的序列\(A,B\),将\(A,B\)进行二路归并,使得最后得到的序列字典序最小.求 ...

  7. 最大流:Dinic算法

    蒟蒻居然今天第一次写网络流 我太弱啦! 最大流问题有很多解法 虽然isap常数巨小 但是连dinic都写挂的本蒟蒻并不会orz 那么我们选用比较好实现的dinic来解决最大流问题 来一段定义:    ...

  8. html标题-段落-字符实体-换行

    Html标题标签: <h1>.<h2>.<h3>.<h4>.<h5>.<h6>标签可以在网页上定义6种级别的标题,这6种级别的标 ...

  9. IE内核浏览器的404页面问题和IE自动缓存引发的问题

    本站404页面被IE替换成IE自己的404页面 在权限设置正确的情况下,自定义的404页面文件大小如果小于512字节,那么IE内核的浏览器会认为你自定义的404页面不够权威,从而使用其自带的404页面 ...

  10. python之进程和线程3

    1 multiprocessing模块 (1.)直接导入 from multiprocessing import Process import os import time def info(name ...