在这种情况下是否需要互斥锁?我正在用goroutine刷新令牌,该令牌在另一个goroutine中使用。换句话说,我的令牌在某个时候是否为空,以便响应为@Projection
?
如果是,它是结构401
的一部分,还是一个简单的变量,我的意思是,代码内部是一个“独立”变量。
c *threatq
答案 0 :(得分:1)
规则很简单:如果从多个goroutine中访问一个变量,并且其中至少一个是写操作,则需要显式同步。
在您的情况下是这样:您的一个goroutine写入了token
变量(还有err
变量!),而另一个则读取了它,因此您必须同步访问。
由于token
不是threatq
结构的字段,因此放置保护它的互斥锁是不明智的。始终将互斥锁放在应保护的数据附近。
一些注意事项:如前所述,您还可以从多个goroutines中读写本地err
变量。您不应该这样做,而应该创建另一个局部变量来保存其他goroutine中的错误(除非您想“转换” goroutine之间的错误,但这不是这种情况)。
查看相关问题:
Immutability of string and concurrency
Should we synchronize variable assignment in goroutine?
golang struct concurrent read and write without Lock is also running ok?
答案 1 :(得分:0)
是的,您也可以尝试在启用-race
标志的情况下运行此测试。 Go的竞赛检测器可能会告诉您,令牌是多个goroutine中的共享变量。因此,必须使用Mutex
或RWMutex
保护它。
在您的情况下,我认为RWMutex
更合适,因为有一个goroutine每30分钟更改(即写入)token
的状态,而另一个goroutine读取其值。
如果您不使用锁保护共享变量,则第二个goroutine可能会读取旧值token
,该值可能已过期。