09 2021 档案
摘要:git add readme.txt git commit -m “wrote a readme file” git status git diff reademe.txt git log git log --pretty=online git reset --hard HEAD^ 回到上一个版本
阅读全文
摘要:type SelectCase struct { Dir SelectDir // direction of case Chan Value // channel to use (for send or receive) Send Value // value to send (for send)
阅读全文
摘要:通过反射的方式执行 select 语句,在处理很多的 case clause,尤其是不定长的 case clause 的时候,非常有用。而且,在后面介绍任务编排的实现时,我也会采用这种方法,所以,我先带你具体学习下 Channel 的反射用法。 使用反射操作 Channel select可以处理ch
阅读全文
摘要:channel的发展 CSP 是 Communicating Sequential Process 的简称,中文直译为通信顺序进程,或者叫做交换信息的循序进程,是用来描述并发系统中进行交互的一种模式。 CSP 最早出现于计算机科学家 Tony Hoare 在 1978 年发表的论文中(你可能不熟悉
阅读全文
摘要:channel入门 channel基础 goroutines之间的通信,让它们之间可以进行数据交换。 像管道一样,一个goroutine_A向channel中放数据,另一个goroutine_B从channel取数据。 (在放和取的过程中,有互斥保证、hapen before保证,具体见unbuff
阅读全文
摘要:func (m *Mutex) Lock() { // 如果mutext的state没有被锁,也没有等待/唤醒的goroutine, 锁处于正常状态,那么获得锁,返回. // 比如锁第一次被goroutine请求时,就是这种状态。或者锁处于空闲的时候,也是这种状态。 if atomic.Compar
阅读全文
摘要:go 的semophor机制,不是内核态的semephor,而是模拟futex,为其他同步原语提供一个sleep和wakeup机制。 因此他们总是成对出现的。 疑问,在使用mutex时,最后信号量唤醒时有个handoff参数,是有什么作用呢?
阅读全文
摘要:常见的等待通知机制:请实现一个限定容量的队列(queue),当队列满或者空的时候,利用等待 / 通知机制实现阻塞或者唤醒。。 在 Go 中,也可以实现一个类似的限定容量的队列,而且实现起来也比较简单,只要用条件变量(Cond)并发原语就可以。Cond 并发原语相对来说不是那么常用,但是在特定的场景使
阅读全文
摘要:内存模型:Go如何保证并发读写的顺序? Go 官方文档里专门介绍了 Go 的内存模型,你不要误解这里的内存模型的含义,它并不是指 Go 对象的内存分配、内存回收和内存整理的规范,它描述的是并发环境中多 goroutine 读相同变量的时候,变量的可见性条件。 具体点说,就是指,在什么条件下,goro
阅读全文
摘要:Once 可以用来执行且仅仅执行一次动作,常常用于单例对象的初始化场景。 (什么是单例对象?) 初始化单例资源有很多方法,比如定义 package 级别的变量,这样程序在启动的时候就可以初始化: package abc import time var startTime = time.Now() 或
阅读全文
摘要:WaitGroup解决的是并发-等待问题:有一个goroutine A在检查点等待一组goroutine 的完成, 如果任务组还没有全部完成,则goroutine A阻塞在检查点,知道任务组goroutine全部完成。 很多操作系统提供了类似的原语,如Linux的Barrier、Pthread(PO
阅读全文
摘要:package myrwmutex import ( "sync/atomic" "sync" ) // go实现的读写锁是写优先,即有写时,会先等待已有的读锁释放,在此写之后的读写操作都必须等此写操作完成 // 而另一种读优先,是指写到达时,之后又有读到达,则如果此时之前的读仍持有锁,则允许继续读
阅读全文
摘要:参考链接: [linux futex浅析] https://developer.aliyun.com/article/6043?spm=a2c6h.13262185.0.0.575c4070sPb94F [Linux Futex的设计与实现] https://blog.csdn.net/jianch
阅读全文
摘要:使用Mutex锁时常见错误: 非成对出现copy某个有状态的Mutex锁的重入死锁 如下为一个错误的重入锁的使用案例: func foo(l sync.Locker) { fmt.Println("in foo") l.Lock() bar(l) l.Unlock() } func bar(l sy
阅读全文
摘要:同时运行的进程要访问共享资源,此共享资源某一时刻只允许某个进程访问,其他进程需要等待,就称为进程间的互斥,操作此共享资源的代码片段称为临界去。 临界的访问要遵循四个原则: 如果没有进程在临界区,则想要进入临界区的进行可以直接进入。如果某个进行在临界区,另外想进入临界去的进程需要等待。正在临界区外的进
阅读全文
摘要:atomic 操作的对象是一个地址,你需要把可寻址的变量的地址作为参数传递给方法,而不是把变量的值传递给方法。 提供的方法有: Add func AddInt32(addr *int32, delta int32) (new int32) 给一个地址上的内容加上值,返回新的值 CAS func Co
阅读全文
摘要:Mutex:如何解决资源并发访问问题 多线程访问共享资源,通过互斥锁来实现,其根本是对共享内存的锁定?(如果是多进程,还能简单使用互斥锁吗,是否需要分布式锁?) 同步原语的使用场景: 共享资源。并发地读写共享资源,会出现数据竞争(data race)的问题,所以需要 Mutex、RWMutex 这样
阅读全文