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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何限制對(duì)單個(gè)實(shí)時(shí)資源的并發(fā)訪問

如何限制對(duì)單個(gè)實(shí)時(shí)資源的并發(fā)訪問

Go
回首憶惘然 2023-05-15 15:02:12
我正在嘗試識(shí)別或理解適用于我遇到的特定并發(fā)編程問題的技術(shù)、慣用語。為簡(jiǎn)單起見,假設(shè)我有一個(gè)實(shí)時(shí)圖形用戶界面 (UI),它始終以 10Hz 的頻率在屏幕上重繪。每當(dāng)一組不同線程的至少一個(gè)實(shí)例正在運(yùn)行時(shí),我想在此 UI 上顯示一個(gè)“忙碌”指示器,并且我希望該指示器在這些線程中正好有 0 個(gè)正在運(yùn)行時(shí)停止顯示。只要 UI 啟動(dòng),這些線程就可以隨時(shí)啟動(dòng)和停止。我目前正在 golang 中實(shí)現(xiàn)這個(gè)(下面有相關(guān)的片段)。但總的來說,我按如下方式解決這個(gè)問題:通過 mutex 保護(hù)對(duì)計(jì)數(shù)器 int waitCount(請(qǐng)求我們指示“繁忙”的線程數(shù))的R+W 訪問waitLock。功能drawStatus():重繪整個(gè) UI(每 100 毫秒發(fā)生一次):繪制“忙碌”指示器獲取互斥體waitLock如果整數(shù)waitCount> 0:釋放互斥體waitLock功能startWait():當(dāng)一個(gè)線程需要指示忙碌時(shí):獲取互斥體waitLock增量整數(shù)waitCount釋放互斥體waitLock功能stopWait():當(dāng)一個(gè)線程不再需要指示繁忙時(shí):獲取互斥體waitLock遞減整數(shù)waitCount釋放互斥體waitLock對(duì)我來說,感覺我沒有充分利用 golang 的并發(fā)功能并訴諸于我熟悉的互斥體。但即便如此,此代碼中仍存在一個(gè)錯(cuò)誤,其中“忙碌”指示器會(huì)過早消失。老實(shí)說,我不是在尋找任何人來幫助識(shí)別該錯(cuò)誤,而是試圖傳達(dá)我感興趣的特定邏輯。是否有更慣用的 golang 方法來解決這個(gè)問題?或者是否有我應(yīng)該研究的更通用的編程模式?我正在使用的這項(xiàng)技術(shù)有任何特定的名稱嗎?關(guān)于正確執(zhí)行此操作的建議或指示會(huì)很棒。謝謝。
查看完整描述

2 回答

?
qq_遁去的一_1

TA貢獻(xiàn)1725條經(jīng)驗(yàn) 獲得超8個(gè)贊

由于您所做的只是鎖定單個(gè)計(jì)數(shù)器,因此您可以簡(jiǎn)化并僅使用sync/atomic包。AddInt32(&x, 1)在啟動(dòng) goroutine 和AddInt32(&x, -1)結(jié)束時(shí)調(diào)用。從您的繪圖 goroutine調(diào)用LoadInt32(&x)



查看完整回答
反對(duì) 回復(fù) 2023-05-15
?
慕容708150

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超4個(gè)贊

它依賴于用例(你可以選擇你想要的,并且在你產(chǎn)生錯(cuò)誤或達(dá)到性能損失之前沒有人關(guān)心),通道將 Lock 隱藏在里面并使編碼更簡(jiǎn)單,但性能成本很小 - 所以我建議使用通道對(duì)于一般用例,除非您正在考慮更高的性能):
在以下情況下使用通道:
1 - 轉(zhuǎn)讓所有權(quán)
2 - 協(xié)調(diào)

在以下情況下使用基元:
3 -性能關(guān)鍵
4 - 保護(hù)結(jié)構(gòu)
引用的內(nèi)部狀態(tài):第 33 頁


由于您使用的是協(xié)調(diào) goroutine 數(shù)量的軟實(shí)時(shí) UI,而不是性能關(guān)鍵代碼,因此我建議使用通道,我在此示例中簡(jiǎn)化了您的代碼:

package main


import (

? ? "fmt"

? ? "math/rand"

? ? "time"

)


func main() {

? ? for i := 0; i < 100; i++ {

? ? ? ? go job() // e.g.: run all jobs

? ? }

? ? busy := 0

? ? time.Sleep(10 * time.Millisecond) // or make sure at least on goroutine started

? ? // 10Hz:

? ? tick := time.NewTicker(100 * time.Millisecond)

? ? defer tick.Stop()

? ? for {

? ? ? ? select {

? ? ? ? case n := <-ch:

? ? ? ? ? ? busy += n

? ? ? ? case <-tick.C:

? ? ? ? ? ? // forces the UI to redraw all changed screen regions

? ? ? ? ? ? fmt.Printf(" %d? ? \r", busy)

? ? ? ? ? ? if busy == 0 {

? ? ? ? ? ? ? ? return

? ? ? ? ? ? }

? ? ? ? }

? ? }

}


func job() {

? ? ch <- +1

? ? time.Sleep(time.Duration(rand.Intn(2000)) * time.Millisecond)

? ? ch <- -1

}


var ch = make(chan int, 1)


查看完整回答
反對(duì) 回復(fù) 2023-05-15
  • 2 回答
  • 0 關(guān)注
  • 178 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)