【发布时间】:2017-07-14 03:46:18
【问题描述】:
在我的代码中有三个并发例程。我尝试简要概述一下我的代码,
Routine 1 {
do something
*Send int to Routine 2
Send int to Routine 3
Print Something
Print Something*
do something
}
Routine 2 {
do something
*Send int to Routine 1
Send int to Routine 3
Print Something
Print Something*
do something
}
Routine 3 {
do something
*Send int to Routine 1
Send int to Routine 2
Print Something
Print Something*
do something
}
main {
routine1
routine2
routine3
}
我希望,当两个之间的代码做某事(两个星号之间的代码)正在执行时,控制流不能转到其他 goroutine。例如,当例程 1 正在执行两颗星之间的事件(发送和打印事件)时,例程 2 和 3 必须被阻塞(意味着执行流程不会从例程 1 传递到例程 2 或 3)。完成最后一个打印事件后,执行流程可能会转到例程 2 或 3。任何人都可以通过指定来帮助我,我该如何实现?是否可以通过WaitGroup 实现上述规范?任何人都可以通过给出一个简单的例子来告诉我如何使用 WaitGroup 来实现上述指定的例子。谢谢。
注意:我给出了两个发送和两个打印选项,实际上有很多发送和打印。
【问题讨论】:
-
请提供一个清晰的场景,甚至是您自己的实现(即使它不起作用)。这里的“发送”命令是什么意思?如果它正在调用一个函数,上面的代码就是一个无限循环。
-
这里发送的意思是,发送一个整数。我的代码可以在play.golang.org/p/wYFViAQbN2 中找到。在我想要的代码中,当例程 1 的第 27 到 35 行(可以说例程 1 的关键部分)正在执行时,其他例程必须停止执行。
-
感谢您提供有用的更新。您不能停止其他 goroutine,但可以阻止执行不同 goroutine 的特定部分,以避免使用互斥锁或阻塞通道同时执行。在这种情况下,我可以帮助您在第 27 行等待其他 goroutine 完成,并在其他 goroutine 的开头等到第 35 行。如果这是您想要的,我可以用代码解释它。
-
我想,例如在上面的例子中,当routine1正在执行发送和打印事件时,程序2和3被阻塞(意味着执行流程不会传递到程序2或3)。完成最后一个打印事件后,执行流程可能会转到例程 2 或 3。
-
Mostafa,当例程 1 从第 27 行到第 35 行执行时,我想等待所有其他 go 例程。
标签: go concurrency goroutine