2 回答
TA贡献1865条经验 获得超7个赞
问题 1.哪种并发机制最适合此问题?通道、等待组、互斥锁等?
没有。您的问题与要并发执行的操作相反,并且没有并发机制可以帮助您。
问题 2.为什么我无法通过以下代码正确打印序列?
您希望独立戈鲁丁同步运行。因此,您必须中断并发性。从技术上讲,在这两个戈鲁丁之间基于通道的乒乓球是可行的,实际上使它们不连贯。您的问题没有合理的“并发”解决方案,您不会从严重解决方案中学到一些东西,其中并发性被强行破坏。
TA贡献1833条经验 获得超4个赞
问1:Which concurrency mechanism best suited for this problem?
答案 1:无。打印连续数字的问题不是并发的。因此,即使您实现了使用Go的并发机制(使用通道或互斥锁)的解决方案,它也不会/无法实际并发运行,因为您想要的是按顺序打印数字。同时运行将打印数字是一个非确定性的顺序。
问2:Why I am not able to print the sequence correctly through below code?
A2:您的代码打印无序,因为一旦触发了 go 例程,您就无法知道它们的执行顺序。所以代码:
...
go even()
go odd()
...
甚至不能保证函数内部的循环会在函数内部的循环之前启动,即使函数在调用之前也是如此。evenoddeven
A2.1:您的代码有时会崩溃,因为在函数内部调用之前,内部函数可能会被调用。WaitGroup is reused before previous Wait has returnedwgO.Done()oddwgO.Wait()even
下面是一个非常愚蠢的实现,使用它可以工作,并说明问题的解决方案必须打破并发才能工作。为了按顺序打印数字,我必须等待每个go例程的完成......sync.WaitGroup
func main() {
var wg sync.WaitGroup
for i := 0; i <= 10; i++ {
if i%2 == 0 {
wg.Add(1)
go func(i int) {
defer wg.Done()
fmt.Println(i)
}(i)
wg.Wait()
} else {
wg.Add(1)
go func(i int) {
defer wg.Done()
fmt.Println(i)
}(i)
wg.Wait()
}
}
}
我不会太纠结于这个问题,因为它不是倾向于Go的并发机制的好例子。
这里有一门关于cooursera的很棒的课程,可以学习Go的并发性
- 2 回答
- 0 关注
- 74 浏览
添加回答
举报