在不同的goroutine中替换字符串的值时是否需要互斥锁?

时间:2019-05-22 09:50:29

标签: go jwt mutex

在这种情况下是否需要互斥锁?我正在用goroutine刷新令牌,该令牌在另一个goroutine中使用。换句话说,我的令牌在某个时候是否为空,以便响应为@Projection

如果是,它是结构401的一部分,还是一个简单的变量,我的意思是,代码内部是一个“独立”变量。

c *threatq

2 个答案:

答案 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?

Reading values from a different thread

Why does this code cause data race?

答案 1 :(得分:0)

是的,您也可以尝试在启用-race标志的情况下运行此测试。 Go的竞赛检测器可能会告诉您,令牌是多个goroutine中的共享变量。因此,必须使用MutexRWMutex保护它。

在您的情况下,我认为RWMutex更合适,因为有一个goroutine每30分钟更改(即写入)token的状态,而另一个goroutine读取其值。

如果您不使用锁保护共享变量,则第二个goroutine可能会读取旧值token,该值可能已过期。