【发布时间】:2021-03-29 17:56:21
【问题描述】:
我有一个方法可以在多个 goroutine 中同时运行。
在这个方法中,我有一个条件语句。如果条件语句为真,我希望所有其他调用此方法的 goroutine 等待 一个且只有一个 goroutine 执行此条件语句,然后再继续下一节。
例如:
type SomeClass struct {
mu sync.Mutex
}
func (c *SomeClass) SomeFunc() {
//Do some calculation
if condition {
//This part should be executed by only one goroutine if the condition is true.
//All others must wait for this to finish
}
//Additional calculations
}
我想这样使用它:
func main(){
//initilize
go someClass.SomeFunc()
//If the condition is true, the following will wait at the conditional statement until the first one finishes the code inside the conditional block
//Once it's done, they can run concurrently
go someClass.SomeFunc()
go someClass.SomeFunc()
}
编辑 这可能不是正确的设计,所以我正在寻找有关如何实现它的任何建议。
编辑2:
请注意,每个例程都有自己的条件。 condition 的值不在线程之间共享。但是,只有当 2 个或多个例程中的条件恰好同时为真时,条件内的工作才应该只运行一次。
【问题讨论】:
-
问题到底是什么?您有一个互斥锁,并且只有一个调用者可以持有您描述的行为的互斥锁。您是否尝试过使用互斥锁?
-
@JimB 问题是如果将锁放在 if 语句中,那么所有例程都会进入该块中,这不是我想要的。如果锁在 if 语句之外,那么所有例程都将在那里等待锁并一次执行一个,即使语句为假。这也不是我想要的。我想确保 if 语句仅在条件为真时由第一个例程执行,一旦完成(或者如果条件为假),那么所有例程都可以并行运行。
-
你描述的可能
sync.Once会是理想的。它确保函数只执行一次,所有的 goroutine 都会等待它完成。 -
当条件发生变化时,可以创建一个新的
sync.Once值。
标签: go synchronization