目录

Golang的多线程

目录
注意
本文最后更新于 2024-01-20,文中内容可能已过时。

原文链接:https://ovea-y.cn/golang_mutli_gorountine_simple/

Golang的线程和其他的语言不太相同,它的并行设计从语言成面上就进行了支持。

Go的线程核心是goroutine,它是用户态实现的线程,因此多个goroutine可以运行在一个实际线程之上。goroutine是通过Go的runtime管理的一个线程管理器,通过go这个关键词就可以启动一个runtime。

go

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

原文链接:https://ovea-y.cn/golang_mutli_gorountine_simple/