2017-11-17 24 views
0

このコードは単純化され、私の問題を説明しています。 atomic.StoreInt32が動作していないようですが、私はなぜそれがわかりません。sync/atomic StoreInt32の不思議な動作

package main 
import (
    "fmt" 
    "sync/atomic" 
) 

type slave struct { 
    failed int32 
} 
func NewSlave() slave { 
    return slave{0} 
} 
func (worker slave) Fail() { 
    atomic.StoreInt32(&worker.failed, 1) // Here's the problem. 
} 
func (worker slave) IsFailed() bool { 
    failed := atomic.LoadInt32(&worker.failed) == 1 
    return failed 
} 
func (worker slave) FailureReset() { 
    atomic.StoreInt32(&worker.failed, 0) 
} 

func main() { 
    s := NewSlave() 
    fmt.Println(s.IsFailed()) 
    s.Fail() 
    fmt.Println(s.IsFailed()) 
    s.FailureReset() 
    fmt.Println(s.IsFailed()) 
} 

- >出力:

false 0 
false 0 
false 0 

- >でテスト:私が読んだ

[email protected] ~/tmp> go version 
go version go1.9.2 linux/amd64 
[email protected] ~/tmp> uname -a 
Linux RECOLICPC 4.13.12-1-ARCH #1 SMP PREEMPT Wed Nov 8 11:54:06 CET 2017 x86_64 GNU/Linux 

usage golang atomic LoadInt32/StoreInt32 (64)

答えて

0

あなたはあなたの方法は、ポインタ受信機を取るようにする必要があり。記述されているように、関数はワーカーのコピーで動作しているため、メソッドを呼び出すために使用されたワーカーは変更されません。このようなメソッドを定義する:

func (worker *slave) Fail() { 
    // ... 
} 
関連する問題