亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在不同的 goroutine 中替換字符串的值時是否需要互斥量?

在不同的 goroutine 中替換字符串的值時是否需要互斥量?

Go
侃侃爾雅 2023-06-19 15:51:48
在這種情況下我需要互斥量嗎?我正在用一個 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 之間的錯誤,但這里不是這種情況)。

查看完整回答
反對 回復 2023-06-19
?
HUWWW

TA貢獻1874條經驗 獲得超12個贊

是的,您也可以嘗試在啟用標志的情況下運行此測試-race。Go 的競爭檢測器可能會告訴您令牌是跨多個 goroutine 的共享變量。因此,必須使用Mutex或 來保護它RWMutex。

在您的情況下,我認為這RWMutex更合適,因為有一個 goroutinetoken每 30 分鐘更改(即寫入)狀態,而另一個 goroutine 讀取其值。

如果您不使用鎖保護共享變量,第二個 goroutine 可能會讀取舊值token,這可能已過期。


查看完整回答
反對 回復 2023-06-19
  • 2 回答
  • 0 關注
  • 130 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號