둘다 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