0
点赞
收藏
分享

微信扫一扫

静态库、动态库、framework、xcframework、use_frameworks!的作用、关联核心SDK工程和测试(主)工程、设备CPU架构

诗与泡面 2024-11-08 阅读 9

1、概念

2、启动一个协程 

3、启动多个协程

package main
import (
"fmt"
"strconv"
"time"
)

func test1(){
for i := 1; i <= 10; i++{
fmt.Println("hello golang" + strconv.Itoa(i))
//阻塞一秒
time.Sleep(time.Second * 1)// 1s
}
}

func main(){ //主线程

//开启一个协程--使用匿名函数
//匿名函数 + 外部变量 = 闭包
for i := 1; i <= 5; i++{
go func(n int){
fmt.Println(n)
}(i)
}

//开启一个协程--使用普通函数
go test1()

for i := 1; i <= 10; i++{
fmt.Println("hello world" + strconv.Itoa(i))
//阻塞一秒
time.Sleep(time.Second * 1)// 1s
}
}

4、使用WaitGroup控制协程退出

WaitGroup用于等待一组线程的结束。父线程调用Add方法来设定应等待的线程的数量,每个被等待的线程在结束时应调用Done方法。同时主线程里可以调用Wait方法阻塞至所有线程结束。用于解决主线程在子协程结束后自动结束,防止主线程退出导致协程被迫退出,


package main
import (
"fmt"
"sync" // 并发包
"time"
"strconv"
)

var wg sync.WaitGroup // 并发包的变量, 只定义无需初始化--类似计数器

func test1(){
//协程执行完毕,协程数量-1
defer wg.Done()
for i := 1; i <= 10; i++{
fmt.Println("hello golang" + strconv.Itoa(i))
//阻塞一秒
time.Sleep(time.Second * 2)// 2s
}
// //协程执行完毕,协程数量-1
// wg.Done()
}

func main(){ //主线程
//开启一个协程--使用普通函数
wg.Add(1) // 协程数量+1
go test1() // 开启协程
//主线程一直阻塞,等待协程执行完毕--直到协程执行完毕才会继续执行主线程
wg.Wait()

for i := 1; i <= 10; i++{
fmt.Println("hello world" + strconv.Itoa(i))
//阻塞一秒
time.Sleep(time.Second * 1)// 1s
}
}

5、多个协程操纵同一数据案例(使用互斥锁同步协程

5.1 互斥锁 


5.2 读写锁 

6、管道

6.1 管道概念

6.2 管道的定义

6.3 管道的关闭

6.4 管道的遍历

6.5 协程和管道协同工作案例

6.6 声明只读只写管道

6.7 管道的阻塞

6.8 select功能

6.9  defer + recover机制处理错误

举报

相关推荐

0 条评论