atomic.LoadInt64(&cnt) 결과가 이상 합니다.
229
작성한 질문수 3
package main
import (
"fmt"
"runtime"
"sync"
"sync/atomic" //
_ "time"
)
func init() {
fmt.Println("Go Sync Advance study 4")
}
func onceTest() {
fmt.Println("onceTest !!")
}
func main() {
// 고루틴 동기화 고급
// 원자성 사용 -> 기능적으로 분할 불가능한 완전 보증된 일려의 조작
// 모든 조작이 완료 될 때까지 다른 프로세스 개입 불가
// sync/atomic 에서 원자적 연산자 제공
// https:// golang.org/pfg/sync/atomic 에서 계열 확인 가능
runtime.GOMAXPROCS(runtime.NumCPU())
var cnt int64 = 0
wg := sync.WaitGroup{}
maxN := 5000
for i := 0; i < maxN; i++ {
wg.Add(1)
go func(n int) {
//cnt++
atomic.AddInt64(&cnt, 1)
wg.Done()
}(i)
}
maxN = 2000
for i := 0; i < maxN; i++ {
wg.Add(1)
go func(n int) {
//cnt--
atomic.AddInt64(&cnt, -1)
wg.Done()
}(i)
}
var finalCnt int64 = 0
finalCnt = atomic.LoadInt64(&cnt)
wg.Wait()
fmt.Println("finalCnt : ", finalCnt)
fmt.Println("cnt : ", cnt)
}
상기 코드를 실행하면
cnt 는 3000 항상 나오는데
finalCnt 는 3005같은 다른 값이 나오는데, 혹시 놓친 부분이 있을까요?
답변 1
0
안녕하세요.
go sync에서 다른 서로 경쟁상태에서 나오는 값이 달라지는 것 같습니다.
https://medium.com/golangspec/synchronized-goroutines-part-i-4fbcdd64a4ec
url을 보시고 go sync 에 대해서 한 번 읽어보시고 소스코드를 리뷰 해보세요.
감사합니다.
고 인터페이스 관련
0
69
2
Join함수 사용이유가 궁금합니다
0
54
1
vscode 설정
0
126
2
arm64
0
202
2
undefined 에러 : UndeclaredImportedName
0
343
1
godoc 에러 관련
0
206
1
package is not in std 오류
0
986
1
맵 예제 코드가 바이러스 검사에 걸려요
0
234
1
for 반복문에서 break와 continue 차이점
0
224
1
후치연산 관련 질문입니다.
0
197
1
package관리에 질문이 있습니다.
0
282
1
go channel 에제에서 질문이 있습니다.
0
193
1
golang 질문
0
310
1
재귀 함수 관련하여 질문이 있습니다.
0
346
1
atom 서비스 종료 관련
0
403
1
vscode 환경설정 업데이트 부탁드립니다
1
405
2
waitGroup.Done을 지연 시키는 방식
0
450
1
첫 번째 예제 질문있습니다.
0
264
1
2개씩 체크가 되는 이유가 궁금합니다.
0
328
1
go 표준 코드 컨벤션이 있나요?
0
825
1
slice에서 make 궁금한 게 있습니다.
1
262
1
import 관리는 어떻게 하나요?
0
317
1
개발환경설정 질문드립니다.
0
486
1
이것도 closure인가요?
0
238
1





