初学go语言,在网上看别人写的教程,在讲解goroutine时,对go的并发性给出了下面这样的一个例子:
package main
import "fmt"
import "time"
import "math/rand"
import "runtime"
import "sync"
var total_tickets int32 = 10
var mutex = &sync.Mutex{}
func sell_tickets(i int) {
for total_tickets > 0 {
mutex.Lock()
if total_tickets > 0 { //如果有票就卖
time.Sleep(time.Duration(rand.Intn(5)) * time.Millisecond)
total_tickets-- //卖一张票
fmt.Println("id:", i, " ticket:", total_tickets)
}
mutex.Unlock()
}
}
func main() {
runtime.GOMAXPROCS(4) //我的电脑是4核处理器,所以我设置了4
rand.Seed(time.Now().Unix()) //生成随机种子
for i := 0; i < 5; i++ { //并发5个goroutine来卖票
fmt.Println(i)
go sell_tickets(i)
}
//等待线程执行完
var input string
fmt.Scanln(&input)
}
按照作者的说法,上锁解决了互斥问题。我在LiteIDE环境下运行了以上代码,得到以下结果:
id: 1 ticket: 9
id: 1 ticket: 8
id: 1 ticket: 7
id: 1 ticket: 6
id: 1 ticket: 5
id: 1 ticket: 4
id: 1 ticket: 3
id: 1 ticket: 2
id: 1 ticket: 1
id: 1 ticket: 0
id值全部为1,运行多次后依然是这个结果。感觉跟作者想要的输出不大一致。id值应该为0~4直接的随机才对。
请各位指教,哪里出了问题?
小白一名,如果问题太幼稚,还请轻喷。
```go
func sell_tickets(i int) {
fmt.Println("sell_tickets", i)
for total_tickets > 0 {
time.Sleep(time.Duration(rand.Intn(5)) * time.Millisecond)
mutex.Lock()
if total_tickets > 0 { //如果有票就卖
total_tickets-- //卖一张票
fmt.Println("id:", i, " ticket:", total_tickets)
}
mutex.Unlock()
}
fmt.Println("sell_tickets over", i)
}
```
#16
更多评论