代码拉取完成,页面将自动刷新
同步操作将从 gaozhichang/golang-study 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
// Package main
/*
@Time : 2024/2/29 21:01
@Author : [email protected]
@File : two_goroutine_print_100.go
@des: GoLand
*/
package main
import (
"fmt"
"sync"
)
func main() {
// oneThread()
twoTread()
}
/*
*
无缓冲
1、定义时若未指定缓冲大小或设置为0,表示当前chan无缓冲。
2、在向chan写入数据时,会阻塞当前协程,直到其他协程从该chan中读取了数据。
3、基于定义2规则,无缓冲chan不能在一个协程同时进行读取与写入操作。
*/
func twoTread() {
exit := make(chan bool)
lock1 := make(chan int) // 这里用无缓冲,会阻塞写入
lock2 := make(chan int)
print100 := func(in, out chan int) {
for {
select {
case i := <-in:
fmt.Println(i)
i++
if i > 100 {
exit <- true
return
}
out <- i
}
}
}
go print100(lock1, lock2)
go print100(lock2, lock1)
lock1 <- 1 // 这个放到协程上面,如果无缓冲,会阻塞
fmt.Println("--start ---")
<-exit
}
func oneThread() {
mu := sync.Mutex{}
out := make(chan int)
for i := 0; i < 100; i++ {
mu.Lock()
go func(i int) {
defer mu.Unlock()
fmt.Println(i)
if i == 99 {
out <- 1
}
}(i)
}
<-out
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。