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() { 
    // ... 
}