如何在一个关键部分上同步多个goroutine?

如何在一个关键部分上同步多个goroutine?,go,Go,我需要在goroutinek中运行的解释代码的关键部分上同步一些goroutine1..n以解释语言(用Go编写)运行代码,这些代码在运行时可能是1..n中的任意一个。也就是说,如果k中的代码正在关键部分运行,则所有其他goroutineI(I≠k、 一,≤k、 我≤n) 需要暂停,直到k完成。解决方案还需要通过在最外层处理或发出错误信号来处理关键部分的错误嵌套 问题是这些goroutine中的每一个都可能在一个紧密的循环中运行代码,而我对这段代码没有直接的控制权——它是由用户解释和提供的。我考

我需要在goroutine
k
中运行的解释代码的关键部分上同步一些goroutine
1..n
以解释语言(用Go编写)运行代码,这些代码在运行时可能是
1..n
中的任意一个。也就是说,如果
k
中的代码正在关键部分运行,则所有其他goroutine
I(I≠k、 一,≤k、 我≤n) 
需要暂停,直到
k
完成。解决方案还需要通过在最外层处理或发出错误信号来处理关键部分的错误嵌套

问题是这些goroutine中的每一个都可能在一个紧密的循环中运行代码,而我对这段代码没有直接的控制权——它是由用户解释和提供的。我考虑过的事情:

  • 搞乱口译员,包括一些让步或支票。这似乎是一种非常低效的处理方式。该语言允许递归,因此我必须检查每个函数调用

  • 在运行goroutines
    i
    时,是否以非合作方式从
    k
    挂起它们?是否可以“从外部(
    =k
    )”暂停Go中的goroutine


  • 用目标语言提供一种方法,共同检查
    k
    是否正在运行,并在需要时停止。我不愿意这样做,因为它基本上是一个泄漏的通道抽象。这也会使编程变得非常复杂,我希望我的解释语言保持简单


  • 你推荐什么。选择2是否可行?还有别的办法吗?非常感谢您的帮助

    您不能从“外部”暂停或杀死goroutine。goroutine必须对这样的请求表示合作。这是一个巨大的麻烦,所以选项2被排除在外。选项1的问题是,我必须包括对每个循环和递归的检查。例如,如果我在Go中迭代一个数组,我必须在循环期间检查k是否正在运行。这听起来非常昂贵。“我希望我的解释语言保持简单”-如果你想让它支持并发和同步,你必须做出一些牺牲。