1. 轻量级线程goroutine和互斥锁的用法
以下代码展示了goroutine的最基本的用法:
package main
func foo() {
n := 1
for {
println("foo:", n)
n += 1
if n > 2 {
break
}
}
}
func bar() {
n := 1
for {
println("bar:", n)
n += 1
if n > 2 {
break
}
}
}
func main() {
go foo()
go bar()
println("Finish!")
}
该代码将foo()和bar()这两个函数当做独立的线程来运行,但是当我们运行该代码的时候没有得到这两个线程的任何输出,如下图所示:
这是因为在这两个线程开始运行之前,主程序就已经运行结束了。为了令这两个线程能够正常运行,我们需要增加一个WaitGroup。修改后的程序如下图所示:
package main
import (
"sync"
)
var wg sync.WaitGroup
func foo() {
defer wg.Done()
n := 1
for {
println("foo:", n)
n += 1
if n > 2 {
break
}
}
}
func bar() {
defer wg.Done()
n := 1
for