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

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

如何對多個(gè) goroutine 共享的數(shù)據(jù)結(jié)構(gòu)執(zhí)行并發(fā)操作

如何對多個(gè) goroutine 共享的數(shù)據(jù)結(jié)構(gòu)執(zhí)行并發(fā)操作

Go
慕田峪7331174 2022-11-08 16:55:48
我在 Go 中解決了一個(gè)難題,它通過旋轉(zhuǎn) ASCII 字節(jié)值以匹配行方式(左->右)或列方式(頂部->底部)的字符串,在 2D 字節(jié)數(shù)組中找到一個(gè)字符串。我能夠按順序解決它,當(dāng)它同時(shí)解決它時(shí),我嘗試啟動(dòng)一個(gè) go-routine 來處理特定的輸入組合,看看是否有任何可能的 25 個(gè)旋轉(zhuǎn)可以找到匹配項(xiàng)。代碼摘要如下該FindByConcurrentRot方法采用 2D 字符數(shù)組輸入并嘗試在各種可能的輸入組合中找到字符串的匹配項(xiàng)。問題是 - 下面使用的并發(fā)方法是否有效?如何改進(jìn)?將順序例程“按原樣”轉(zhuǎn)換為并發(fā)程序的方法是否錯(cuò)誤?即是否應(yīng)該重寫整個(gè)程序以充分利用并發(fā)特性?// searchResult defines the information needed to pass to identify if a match has been identified during concurrent searchtype searchResult struct {    row   int    col   int    rot   int    found bool}// processSearchResults runs the gorotuine to perform the search for a particular rotation of inputfunc processSearchResults(wg *sync.WaitGroup, iter int, resultChan chan searchResult, table [][]byte, word string) {    // call goroutine end when the function returns    defer wg.Done()    if iter >= 1 {        rotate(table, iter)    }    x, y, match := present(table, word)    if match {        resultChan <- searchResult{row: x, col: y, rot: iter, found: true}        return    }    resultChan <- searchResult{found: false}}// doCopy creates a copy of the original table to passed for each iteration of the concurrent search// This is an EXPENSIVE operation on a goroutine, because of memory copy operations// The copy is needed for the goroutines to have their own control of data and not run into data// races by passing the original data to each of themfunc doCopy(table [][]byte) [][]byte {    copyTable := make([][]byte, len(table))    for i := range table {        copyTable[i] = make([]byte, len(table[i]))        copy(copyTable[i], table[i])    }    return copyTable}此 Go 操場鏈接上的完整 MVCE - https://go.dev/play/p/7YFAsAlFRUw
查看完整描述

1 回答

?
慕碼人2483693

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

這種方法很可能會(huì)因復(fù)制表所花費(fèi)的周期過多而受到影響。由于每個(gè) goroutine 都在修改表,因此每個(gè) goroutine 都必須獲得一個(gè)單獨(dú)的副本。


另一種方法是在只讀表的頂部添加一個(gè)層,為每個(gè) goroutine 提供修改后的視圖。這并不能保證更好的性能,但它可能比使用多個(gè) goroutine 復(fù)制的性能更好。


方法是有一個(gè)表格視圖:


type tableView struct {

   inc int

   table [][]byte

}


func (t tableView) get(row,col int) byte {

   v:=t.table[row][col]

   v+=t.inc

   if v>'z' {...}

   return v

}

然后,您初始化并傳遞一個(gè) tableView 實(shí)例。


再說一遍:這可能不會(huì)像您期望的那樣快,但它可能比表的多個(gè)副本執(zhí)行得更好。您必須測試并查看。


查看完整回答
反對 回復(fù) 2022-11-08
  • 1 回答
  • 0 關(guān)注
  • 107 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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