2017-01-10 8 views
0

ここにatomic.Valueを使用して構造体Bの書き込みと読み取りの相互アクセスをテストするコードがありますが、無効なポインタアクセスを示すエラーがあります。だから何をすべきか?そして、これを行う慣用句は何ですか?golangのアトミックのロードとストアの使用方法

type A struct { 
    numMap map[string]int 
} 

type B struct { 
    numMap map[string]*A 
} 

var store atomic.Value 

var chanA chan bool = make(chan bool, 100) 
var chanB chan bool = make(chan bool, 100) 

var b *B = &B{} 

func fetchB() { 
    for i := 0; i < 10000; i++ { 
     c := store.Load().(B) 
     for k, v := range c.numMap { 
      fmt.Println(k, v) 
      for k2, v2 := range v.numMap { 
       fmt.Println(k2, v2) 
      } 
     } 
    } 
    chanA <- true 
} 

func writeB() { 
    for i := 0; i < 10000; i++ { 
     //b := store.Load().(B) 
     a := new(A) 
     a.numMap = make(map[string]int) 
     a.numMap["AMap"] = i 
     b.numMap = make(map[string]*A) 
     b.numMap["str"] = a 
     b.numMap["strA"] = a 
     delete(b.numMap, "str") 
     delete(b.numMap["strA"].numMap, "AMap") 
     store.Store(b) 
    } 
    chanB <- true 
} 
func main() { 
    store.Store(*b) 
    for i := 0; i < 100; i++ { 
     go writeB() 
     go fetchB() 
    } 
    for i := 0; i < 100; i++ { 
     <-chanA 
     <-chanB 
    } 
} 

私は質問の最初の投稿で何かを逃した。私がb:= store.Load()。(B)にコメントすると、エラーが発生し、表示されたままになっていると消えてしまいます。それでなぜこれが起こるのだろうか?

私が持っているエラーは、このようなものです:あなたがb := store.Load().(B)をコメントアウトすると

panic: sync/atomic: store of inconsistently typed value into Value 

goroutine 5 [running]: sync/atomic.(*Value).Store(0x597310, 0x4b7f40, 0x597198) 
    /usr/local/go/src/sync/atomic/value.go:76 +0x1e9 main.writeB() 
    /home/bzhang/devCode/common/src/go/src/audience_service/test.go:47 +0x2cc created by main.main 
    /home/bzhang/devCode/common/src/go/src/audience_service/test.go:54 +0x71 

goroutine 1 [chan receive]: main.main() 
    /home/bzhang/devCode/common/src/go/src/audience_service/test.go:59 +0xf3 

goroutine 6 [runnable]: main.fetchB() 
    /home/bzhang/devCode/common/src/go/src/audience_service/test.go:23 created by main.main 
    /home/bzhang/devCode/common/src/go/src/audience_service/test.go:55 +0x89 

goroutine 7 [runnable]: main.writeB() 
    /home/bzhang/devCode/common/src/go/src/audience_service/test.go:36 created by main.main 
    /home/bzhang/devCode/common/src/go/src/audience_service/test.go:54 +0x71 

goroutine 8 [runnable]: main.fetchB() 
    /home/bzhang/devCode/common/src/go/src/audience_service/test.go:23 created by main.main 
    /home/bzhang/devCode/common/src/go/src/audience_service/test.go:55 +0x89 

goroutine 9 [runnable]: main.writeB() 
    /home/bzhang/devCode/common/src/go/src/audience_service/test.go:36 created by main.main 
    /home/bzhang/devCode/common/src/go/src/audience_service/test.go:54 +0x7 
+1

どのGoバージョンをお使いですか? – Ankur

+0

私はgo version go1.5.3 linux/amd64を使用しています –

+1

プログラムを実行すると正確なエラーを貼り付けることができますか? – Ankur

答えて

0

機能で使用される変数bがタイプ*Bであり、あなたがstore.Store(b)を行うときに取得グローバルbですこのエラーは、タイプBの値を持つストアに*Bタイプの値を格納しようとしているためです。そのため、エラーは一貫性のないタイプについて語ります。 store.Store(b)store.Store(*b)に変更すると、コードはエラーなく動作します。

関連する問題