2 回答

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊
在測試中,有時(shí)會出現(xiàn)競爭條件,即 go 例程尚未更新計(jì)數(shù)器緩存。我目前在操作后使用 1 秒睡眠來確保在測試計(jì)數(shù)器緩存之前更新了計(jì)數(shù)器緩存。
哎呀,我不想這么說,但你做錯(cuò)了。Go 具有一流的功能,使并發(fā)變得容易!如果您正確使用它們,則不可能有競爭條件。
事實(shí)上,有一種工具可以為您檢測種族。我敢打賭它會抱怨你的程序。
一個(gè)簡單的解決方案:
讓主程序創(chuàng)建一個(gè) goroutine 來跟蹤計(jì)數(shù)器。
goroutine 只會做一個(gè)選擇并獲取一條消息來增加/減少或讀取計(jì)數(shù)器。(如果是讀取,會傳入一個(gè)通道返回編號)
當(dāng)您創(chuàng)建/刪除資源時(shí),通過它的通道向 goroutine 計(jì)數(shù)器發(fā)送適當(dāng)?shù)南ⅰ?/p>
當(dāng)要讀取計(jì)數(shù)器時(shí),發(fā)送消息進(jìn)行讀取,然后讀取返回通道。
(另一種選擇是使用鎖。它的性能會更高一點(diǎn),但編寫并確保它是正確的要麻煩得多。)

TA貢獻(xiàn)1830條經(jīng)驗(yàn) 獲得超9個(gè)贊
一種解決方案是讓您的柜臺提供一個(gè)渠道,該渠道在價(jià)值發(fā)生變化時(shí)立即更新。在 go 中,通過傳達(dá)結(jié)果來同步是常見的做法。例如,您 Couter可能看起來像這樣:
type Counter struct {
value int
ValueChange chan int
}
func (c *Counter) Change(n int) {
c.value += n
c.ValueChange <- c.value
}
每當(dāng)Change被調(diào)用時(shí),新值都會通過通道傳遞,等待該值的人會解除阻塞并繼續(xù)執(zhí)行,因此與計(jì)數(shù)器同步。使用此代碼,您可以監(jiān)聽如下ValueChange更改:
v := <-c.ValueChange
并發(fā)調(diào)用c.Change不再是問題。
- 2 回答
- 0 關(guān)注
- 247 瀏覽
添加回答
舉報(bào)