当填充通道的函数调用未嵌入 Goroutine 中时,为什么会出现死锁?

当填充通道的函数调用未嵌入 goroutine 中时,为什么会出现死锁?

当填充通道的函数调用未嵌入Goroutine中时,会出现死锁的原因是因为通道的发送和接收操作是阻塞的。如果在主Goroutine中调用填充通道的函数,并且该函数内部没有将填充操作放入新的Goroutine中运行,那么主Goroutine会一直等待通道有足够的空间来接收数据,而填充操作又无法进行,从而导致死锁的产生。因此,为了避免死锁,我们需要在填充通道的操作中使用Goroutine来进行并发执行,以确保填充操作和接收操作可以同时进行。

问题内容

我知道 sync 包及其 waitgroup 选项,我不想将其用于此测试。我正在测试一种信号量。

所以我有:

package main import ( "fmt" "os" "time" ) func main() { fmt.print("wassap") jobs := make(chan int) processstarted := make(chan struct{}, 1) processcompleted := make(chan struct{}, 1) createjobs(jobs) go func() { worker(jobs, processstarted, processcompleted) }() go func() { sync(processstarted, processcompleted) }() time.sleep(3600 * time.second) fmt.print("nend of main...") interrupt := make(chan os.signal) 登录后复制