본문 바로가기
Go

GO Concurrency

by Fastlane 2021. 12. 22.
728x90
반응형

Concurrency (동시성) 란 여러가지 작업을 동시에 처리하는 것을 말한다.

물론 CPU의 코어 갯수 및 현재 활성화 되어 있는 쓰레드 갯수에 따라 동작한다.

 

GO에서는 OS의 쓰레드에 의존하지 않고 (오버헤드가 크기 때문) goroutine이라는 별도의 경량쓰레드를 사용하여 동시성 문제를 해결한다.

 

package main

import (
   "fmt"
   "time"
)

var count int

func job() {
   for i := 0; i < 50; i++ {
      time.Sleep(time.Second / 10)
      fmt.Printf("sub: %d\n", ++count)
   }
}

func main() {
   go job()
   for i := 0; i < 100; i++ {
      time.Sleep(time.Second / 10)
      fmt.Printf("main: %d\n", ++count)
   }
}

위의 main 함수에서 job() 함수를 호출하는 부분 왼쪽에 보이는 go 키워드가 goroutine 을 의미한다.

 

사용법은 간단하지만 OS의 쓰레드를 사용할 때와 같이 여러 goroutine이 공유 변수에 접근할 때 문제가 생길 수 있다.

 

이를 해결하기 위해 mutex 나 semaphore를 사용해야 한다.

 

그래야만 쓰레드가 Critical Section에 서로 접근하여 자원을 사용할 수 있기 때문이다.

 

package main

import (
    "sync"
    "fmt"
)

var total int
var wg sync.WaitGroup
var mutex sync.Mutex

func main() {
	wg.Add(100)
	for i := 0; i < 100; i++ {
		go func() {
			mutex.Lock()
			inc := total
			inc++
			total = inc
			mutex.Unlock()
			wg.Done()
		}()
	}
	wg.Wait()
	fmt.Println(total)
}

 

하지만 go에서는 이부분 마저도 쉽게 사용하기 위해 channel 을 사용한다.

 

channel은 다음 글에 설명하도록 하겠다.

 

728x90
반응형

댓글