第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決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條經(jīng)驗 獲得超8個贊

規(guī)則很簡單:如果從多個 goroutine 訪問一個變量并且其中至少有一個是寫入,則需要顯式同步。

在您的情況下是這樣:您的一個 goroutine 寫入token變量(還有err變量?。?,另一個 goroutine 讀取它,因此您必須同步訪問。

由于token它不是結構的一個字段threatq,因此放置保護它的互斥量并不明智。始終將互斥量放在它應該保護的數(shù)據(jù)附近。

一些注意事項:如前所述,您還err從多個 goroutine 中寫入和讀取局部變量。你不應該這樣做,而是創(chuàng)建另一個局部變量來保存來自其他 goroutines 的錯誤(除非你想“translfer” goroutines 之間的錯誤,但這里不是這種情況)。

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

TA貢獻1874條經(jīng)驗 獲得超12個贊

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

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

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


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

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號