둘다 int32 자료에 99만9천번씩 더하고 빼고를 해서 제대로 레이스 컨디션 피해갔는지, 속도는 어떤지 아래 소스로 시험해봤는데
- 원자적 연산 이용 소스
package main
import (
"fmt"
"sync"
"sync/atomic"
"runtime"
)
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
var data int32 = 0
wg := new(sync.WaitGroup)
for i := 0; i < 999999; i++ {
wg.Add(1)
go func() {
atomic.AddInt32(&data, 1)
wg.Done()
}()
}
for i := 0; i < 999999; i++ {
wg.Add(1)
go func() {
atomic.AddInt32(&data, -1)
wg.Done()
}()
}
wg.Wait()
fmt.Println(data)
}
- sync.Mutex 이용 소스
package main
import (
"fmt"
"sync"
"runtime"
)
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
var data int32 = 0
wg := new(sync.WaitGroup)
mutex := new(sync.Mutex)
for i := 0; i < 999999; i++ {
wg.Add(1)
go func() {
mutex.Lock()
data += 1
mutex.Unlock()
wg.Done()
}()
}
for i := 0; i < 999999; i++ {
wg.Add(1)
go func() {
mutex.Lock()
data -= 1
mutex.Unlock()
wg.Done()
}()
}
wg.Wait()
fmt.Println(data)
}
- 출력
둘다 0으로 성공적으로 수행됨
- 원자적 연산 시간
0m1.625s
0m1.640s
0m1.626s
0m1.611s
0m1.663s
- sync.Mutex 시간
0m1.546s
0m1.620s
0m1.547s
0m1.581s
0m1.589s
http://egloos.zum.com/minjang/v/2907073
아, 둘다 리눅스에서 컴파일 후 실행했고, 시간 측정은 외부에서 time 명령어로 측정.
시간나면 이글 한번 읽어보셈
ㄴ 나같은 무식이에게는 정독이 필요한 문서군 ㄷㄷ
ㄴ 그럼 반복문 내부 명령이 병렬처리가 안 되고 순차적으로 돌아가니까 의미가 없지
고루틴은 스레드 몇개 생성 이런 개념이 아님.. 고루틴이라는 새로운 개념으로 병렬처리를 하되 사용하는 코어 개수를 조절할 수 있는 것.
스레드 하나에 여러개의 고루틴이 달리고 그런 스레드가 또 여러개 생기고.. 그런데 내가 하나의 스레드에 몇개의 고루틴이 붙을지 조절하는 건 아니고 자동으로.. 내가 덜 배워서 또 방법이 있을지는 모르겠는데.
우와 어렵ㄷ
방금 각각 1억회씩 더하고 빼기로 해봤는데 atomic 2분42초, mutex 2분40초 나온다 ㅋㅋ 원리상 atomic이 빨라야될 것 같은데 왜지 ㅋㅋㅋ