var wg sync.WaitGroup
wg.Add(3)
wg.Done()
wg.Wait()
package main
import (
"fmt"
"sync"
)
var wg sync.WaitGroup // ❶ waitGroup 객체
func SumAtoB(a, b int) {
sum := 0
for i := a; i <= b; i++ {
sum += i
}
fmt.Printf("%d부터 %d까지 합계는 %d입니다.\n", a, b, sum)
wg.Done()
}
func main() {
wg.Add(10) // ❷ 총 작업 개수 설정
for i := 0; i < 10; i++ {
go SumAtoB(1, 1000000000)
}
wg.Wait() // ❹ 모든 작업이 완료되길 기다림.
fmt.Println("모든 계산이 완료되었습니다.")
}
상호배제 방법으로는 Mutex, Semaphore 방식이 사용된다. java에서 Synchronized 인가?
//ch24/ex24.4/ex24.4.go
package main
import (
"fmt"
"sync"
"time"
)
var mutex sync.Mutex // ❶ 패키지 전역 변수 뮤텍스
type Account struct {
Balance int
}
func DepositAndWithdraw(account *Account) {
mutex.Lock() // ❷ 뮤텍스 획득
defer mutex.Unlock() // ❸ defer를 사용한 Unlock()
if account.Balance < 0 {
panic(fmt.Sprintf("Balance should not be negative value: %d", account.Balance))
}
account.Balance += 1000
time.Sleep(time.Millisecond)
account.Balance -= 1000
}
func main() {
var wg sync.WaitGroup
account := &Account{0}
wg.Add(10)
for i := 0; i < 10; i++ {
go func() {
for {
DepositAndWithdraw(account)
}
wg.Done()
}()
}
wg.Wait()
}