Goroutine和互斥

时间:2018-06-19 19:36:42

标签: go goroutine

CREATE TABLE dcarlo.new_table AS

SELECT ma.name, ma.address, ma.state 
FROM main_db AS ma
WHERE ma.dt>=20180301 AND ma.dt<=20180331;

我有一个正在工作的Golang项目,该项目具有遵循上述逻辑的代码块。

我不明白为什么这种逻辑会起作用,因为我曾预计会出现死锁。

1 个答案:

答案 0 :(得分:0)

我们将在输入start到G1时调用正在运行的初始goroutine。

  1. {G1中的start}锁定互斥锁并推迟解锁,直到start返回。
  2. start在新的goroutine(G2)中调用s.processing
  3. start在新的goroutine(G3)中调用自己
  4. start(G1)解锁互斥锁并返回。

除第1步中的锁定外,这些呼叫中没有一个是阻塞呼叫。 同时,在G2中,s.processing等待start解锁互斥锁(这很快就会发生,因为所有start所做的只是在解锁该互斥锁之前启动了几个goroutine。互斥体)。同时,在G3中,上述4个步骤又重新执行了(显然是无限循环)。

该逻辑中没有任何可能导致死锁的点。