![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Go
Hascats
open and deep
展开
-
Go并发编程-模拟并发模型-司机与售票员
上题代码实现:package ossyncimport ( "fmt")/* while (true) while (true) { { 启动车辆; 关门; 正常运行; 售票; 到站停车; 开门; } } 关门才可以启动车辆; 停车之后才能开门;*/var canStart = make(chan bool)//表示司机进程p1能否...原创 2020-03-29 12:19:22 · 322 阅读 · 0 评论 -
Go并发编程-模拟并发模型-案例1
上题初步代码实现:package mainimport ( "fmt" "sync" "time")var wg sync.WaitGroupvar S1 bool //S1,表示P1能否开始执行var S2 bool //S2,表示P1能否开始执行var S3 bool //S3,表示P1能否开始执行var S4 int //S4,表示P4能否开始执行fu...原创 2020-03-29 00:47:38 · 377 阅读 · 0 评论 -
Go语言并发编程-缓冲和单向通道
缓冲通道缓冲通道就是指一个通道带有一个缓冲区,发送数据到一个缓冲通道只有在缓冲区满时才被阻塞,从缓冲通道获取数据只有在缓冲区为空时才会被阻塞。通道可以存放的数据个数为1+缓冲区容量代码实现:package mainimport ( "fmt" "strconv")func main(){ ch := make(chan string, 4) //缓冲区容量为4 go se...原创 2020-03-28 19:45:43 · 310 阅读 · 0 评论 -
Go语言并发编程-channel通道
通道的概念通道可以被认为是Goroutines通信的管道。数据可以从一端发送到另一端,通过通道接受。Go语言强烈建议的是使用Channel通道来实现Goroutines之间的通信。Go语言种,要传递某个数据给另一个goroutine(协程),可以把这个数据封装成一个对象,然后把这个对象的指针传入某个channel中,另外一个goroutine能够访问channel里面的数据,从而代替使用共享内...原创 2020-03-28 18:22:35 · 194 阅读 · 0 评论 -
Go语言并发编程-读写锁
RWMutex(读写锁)通过对互斥锁的学习,我们已经了解了锁的概念及用途。主要用于处理并发中的临界资源问题。RWMutex是基于Mutex实现的,只读锁的实现使用类似引用计数器的功能。RWMutext是读/写互斥锁。锁可以由任意数量的读取器或单个编写器持有。RWMutex的零值是未锁定的mutex。当有一个goroutine获得写锁定,其他无论是读锁定还是写锁定都将阻塞知道写解锁;当有一...原创 2020-03-26 20:52:25 · 217 阅读 · 0 评论 -
Go语言并发编程-sync包中WaitGroup
并发进程同步工具-WaitGroup使用等待组进行多个任务的同步,等待组可以保证在并发环境中完成指定数量的任务等待组的方法:方法名功能(wg *WaitGroup)Add(delta int)等待组的计数器+1(wg *WaitGroup)Done()等待组的计数器-1(wg *WaitGroup)Wait()当等待组计数器不等于0时阻塞,直到为0...原创 2020-03-26 19:14:51 · 178 阅读 · 0 评论 -
Go语言并发编程-临界资源安全与互斥锁
引入在任何支持并发编程的语言中,进程/线程对临界资源的竞争都是不可避免的问题,举一个例子来引入package mainimport ( "fmt" "math/rand" "time")//全局变量票数var tickets = 10func main(){ //三个goroutine 模拟售票窗口 go saleTickets("售票口1") go saleTi...原创 2020-03-26 19:02:20 · 300 阅读 · 0 评论