Golang的多线程
目录
注意
本文最后更新于 2024-01-20,文中内容可能已过时。
Golang的线程和其他的语言不太相同,它的并行设计从语言成面上就进行了支持。
Go的线程核心是goroutine,它是用户态实现的线程,因此多个goroutine可以运行在一个实际线程之上。goroutine是通过Go的runtime管理的一个线程管理器,通过go
这个关键词就可以启动一个runtime。
package main
import (
"fmt"
"sync"
"runtime"
)
// ### 此处的写法是错误的,wg传递的是副本而不是指针,因此Done不会对外面的WaitGroup有任何作用。
// func say(s string, wg sync.WaitGroup) {
// for i := 0; i < 3; i++ {
// // 让出CPU时间片
// runtime.Gosched()
// // 输出字符
// fmt.Println(s)
// }
// wg.Done()
// }
func say(s string, wg *sync.WaitGroup) {
for i := 0; i < 3; i++ {
// 让出CPU时间片
runtime.Gosched()
// 输出字符
fmt.Println(s)
}
wg.Done()
}
func say1(s string, done func()) {
// defer 要求在函数返回前一刻进行执行
defer done()
for i := 0; i < 3; i++ {
// 让出CPU时间片
runtime.Gosched()
// 输出字符
fmt.Println(s)
}
}
func main() {
var wg sync.WaitGroup
wg.Add(4)
// go say("world", wg)
// say("hello", wg)
go say("A", &wg)
say("B", &wg)
go say1("C", wg.Done) //开一个新的Goroutines执行
say1("D", wg.Done) //当前Goroutines执行
wg.Wait()
}
参考资料
https://www.w3cschool.cn/yqbmht/rejgaozt.html