golangの地図からの読み書きのロックバージョンを実装しようとしましたが、目的の結果が返されません。ロック付き地図からの読み込みはチャンネル経由で値を返しません
パッケージメイン
import (
"sync"
"fmt"
)
var m = map[int]string{}
var lock = sync.RWMutex{}
func StoreUrl(id int, url string) {
for {
lock.Lock()
defer lock.Unlock()
m[id] = url
}
}
func LoadUrl(id int, ch chan string) {
for {
lock.RLock()
defer lock.RUnlock()
r := m[id]
ch <- r
}
}
func main() {
go StoreUrl(125, "www.google.com")
chb := make(chan string)
go LoadUrl(125, chb);
C := <-chb
fmt.Println("Result:", C)
}
出力は次のようになります。値を意味
Result:
は、私は取得しないチャネルを介して返されません。ロック/ゴルーチンなしでは正常に動作するようです。私は何を間違えたのですか?
コードもここで見つけることができます:スリープ状態またはIOのいくつかの種類なし
https://play.golang.org/p/-WmRcMty5B
は、なぜあなたは1つのURLを格納するための無限ループが必要なのでしょうか? LoadUrlについても同じですか?あなたのローカルマシンでこのコードを試してみましたか? –
はい私は私のローカルマシンでこのコードを試しました、私はそれほど大きな問題を抱えていました。http://stackoverflow.com/a/38140573/132728 – Max
@Max無限ループはどちらも不要です。彼らは[goroutine leakage](https://dave.cheney.net/2016/12/22/never-start-a-goroutine-without-knowing-how-it-will-stop)を引き起こします。 –