在這種情況下我需要互斥量嗎?我正在用一個 goroutine 刷新令牌,該令牌在另一個 goroutine 中使用。換句話說,我的令牌是否會在某個時候為空,以便響應為401?如果是,它是結構的一部分c *threatq還是一個簡單的變量,我的意思是,我的代碼中的一個“獨立”變量。// IndicatorChannelIterator returns indicators from ThreatQ into a channel.func (c *threatq) IndicatorChannelIterator() (<-chan *models.Indicator, error) { // Authenticate token, err := c.authenticate(c.clientID, c.email, c.password) if err != nil { return nil, fmt.Errorf("Error while authenticating to TQ : %s", err) } // Periodically refresh the token ticker := time.NewTicker(30 * time.Minute) go func() { for range ticker.C { token, err = c.authenticate(c.clientID, c.email, c.password) if err != nil { logrus.Errorf("Error while authenticating to TQ : %s", err) } } }() // Prepare the query query := &Query{} // Get the first page firstTQResponse, err := c.advancedSearch(query, token, 0) if err != nil { return nil, fmt.Errorf("Error while getting the first page from TQ : %s", err) } // Create the channel indicators := make(chan *models.Indicator) // Request the others go func() { req := 1 total := firstTQResponse.Total for offset := 0; offset < total; offset += c.perPage { // Search the indicators tqResponse, err := c.advancedSearch(query, token, offset) if err != nil { logrus.Errorf("Error while getting the indicators from TQ : %s", err) continue }...
2 回答

慕桂英3389331
TA貢獻2036條經驗 獲得超8個贊
規則很簡單:如果從多個 goroutine 訪問一個變量并且其中至少有一個是寫入,則需要顯式同步。
在您的情況下是這樣:您的一個 goroutine 寫入token
變量(還有err
變量!),另一個 goroutine 讀取它,因此您必須同步訪問。
由于token
它不是結構的一個字段threatq
,因此放置保護它的互斥量并不明智。始終將互斥量放在它應該保護的數據附近。
一些注意事項:如前所述,您還err
從多個 goroutine 中寫入和讀取局部變量。你不應該這樣做,而是創建另一個局部變量來保存來自其他 goroutines 的錯誤(除非你想“translfer” goroutines 之間的錯誤,但這里不是這種情況)。

HUWWW
TA貢獻1874條經驗 獲得超12個贊
是的,您也可以嘗試在啟用標志的情況下運行此測試-race
。Go 的競爭檢測器可能會告訴您令牌是跨多個 goroutine 的共享變量。因此,必須使用Mutex
或 來保護它RWMutex
。
在您的情況下,我認為這RWMutex
更合適,因為有一個 goroutinetoken
每 30 分鐘更改(即寫入)狀態,而另一個 goroutine 讀取其值。
如果您不使用鎖保護共享變量,第二個 goroutine 可能會讀取舊值token
,這可能已過期。
- 2 回答
- 0 關注
- 130 瀏覽
添加回答
舉報
0/150
提交
取消