036_go 언어의 원자 계수기

1004 단어
코드 데모
package main

import (
	"fmt"
	"runtime"
	"sync/atomic"
	"time"
)

func main() {
	var ops uint64 = 0
	for i := 0; i < 50; i++ {
		go func() {
			for {
				atomic.AddUint64(&ops, 1)
				runtime.Gosched()
			}
		}()
	}
	time.Sleep(time.Second)
	opsFinal := atomic.LoadUint64(&ops)
	fmt.Println("ops:", opsFinal)
}

  
코드 실행 결과
ops: 7838509

  
코드 판독
  • 고 언어에서 가장 주요한 상태 관리 방식은 통로 간의 소통을 통해 이루어진 것이다. 본 예에서 우리는sync/atomic 패키지로 여러 개의 고 협정에서 원자계수
  • 를 진행한다.
  • 먼저 하나의ops를 무기호 성형(영원히 정수)으로 정의한 다음에 50개의 협정을 시작하고 계수기를 일정 시간마다 1씩 추가하는 조작
  • ops의 메모리 주소를 사용하여 원래의 값을 수정하고 새 값을 복사하지 않습니다
  • runtime.Gosched()는 다른 협업으로 계속할 수 있는 역할을 합니다.예를 들어 첫 번째 협정 for 순환이 여기까지 집행되고 두 번째 협정은 릴레이로 계속 집행할 수 있다
  • 마지막으로 1초를 기다렸고 협정에 충분한 시간을 남겨서 최종적으로 계수기의 값을 읽었다
  • 좋은 웹페이지 즐겨찾기