作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试了解 channel 和例程。为此,我正在进行在线练习。我在这里找到一个:http://whipperstacker.com/2015/10/05/3-trivial-concurrency-exercises-for-the-confused-newbie-gopher/
我解决了第三个问题(名为“网吧”)。
但是我通过“运气”解决了某些问题,这困扰着我,因为我不了解我的问题以及为什么我的“hack”解决了这个问题。
在下面的代码中,我将“enterChan <-next”替换为“go func(){enterChan <-next}()”,它解决了我的僵局。
有人可以向我解释为什么它之前会死锁,以及为什么它可以与这种hack一起使用吗?这是一个适当的解决方案,还是一个丑陋的解决方案?
不要犹豫,批评我的代码,我正在寻求改进:)
非常感谢!
这是我的代码:
package main
import (
"fmt"
"math/rand"
"strconv"
"time"
)
const (
maxNumberOfUser = 8
)
func useComputer(tourist string, leaverChan chan string) {
seed := rand.NewSource(time.Now().UnixNano())
random := rand.New(seed)
fmt.Println(tourist, "is online")
d := random.Intn(120-15) + 15
time.Sleep(time.Duration(d) * time.Millisecond * 10)
fmt.Println(tourist, "is done, having spent", d, "minutes online.")
leaverChan <- tourist
}
func manageUsers(enterChan, leaverChan chan string, stopChan chan struct{}) {
nbUsed := 0
queue := make([]string, 0)
for {
select {
case tourist := <-enterChan:
if nbUsed < maxNumberOfUser {
nbUsed++
go useComputer(tourist, leaverChan)
} else {
fmt.Println(tourist, "waiting for turn.")
queue = append(queue, tourist)
}
case tourist := <-leaverChan:
nbUsed--
fmt.Println(tourist, "is leaving, number of free place is now:", maxNumberOfUser-nbUsed)
if len(queue) > 0 {
next := queue[0]
queue = queue[1:]
go func() {
enterChan <- next
}()
} else if nbUsed == 0 {
close(stopChan)
return
}
}
}
}
func main() {
enterChan := make(chan string)
leaverChan := make(chan string)
stopChan := make(chan struct{})
go manageUsers(enterChan, leaverChan, stopChan)
for i := 1; i <= 25; i++ {
enterChan <- "Tourist " + strconv.Itoa(i)
}
<-stopChan
fmt.Println("The place is empty, let's close up and go to the beach!")
}
最佳答案
如@ dev.bmax所解释, enterChan 不是缓冲的 channel ,您正尝试将数据发送到未被读取的 channel 。例如,下面的代码将导致死锁错误:
package main
import (
"fmt"
)
func main() {
stream := make(chan int)
<-stream
stream<-1
fmt.Println("Yayyy!! no deadlock!")
}
package main
import (
"fmt"
)
func main() {
stream := make(chan int)
go func(){<-stream}()
stream<-1
fmt.Println("Yayyy!! no deadlock!")
}
关于go - 我靠运气解决的Golang僵局,需要说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45683375/
我刚刚开始学习汇编并使用 C++ 的 asm{} 主体和 C-Free 5.0 中的 Digital-Mars 编译器制作一些自定义循环来交换两个变量 启用-o(优化) 并得到结果: time of
我是一名优秀的程序员,十分优秀!