[Go菜牛シリーズ]よくある同時モード

6262 ワード

本稿では、よく見られる同時モードの使い方を見てみましょう.ほとんどの言語では、スレッド同期の問題を解決するためにロックをかける方法が使用されます.Goも例外ではないが、Goは同期通信の問題を解決するための別の方法を提供している:共有する値をチャネルを介して伝送する.実際にはgoroutineとchannelの組み合わせによってこの特性を実現した.
  • 相互反発ロックにより同期通信
  • を実現する.
    package main
    
    import (
            "fmt"
            "sync"
    )
    
    func main() {
            var mux sync.Mutex
    
            //  
            mux.Lock()
            go func() {
                    fmt.Println("Hello my friend!")
                    //  
                    mux.Unlock()
            }()
            //  , 
            mux.Lock()
    }
    
  • はsyncを通過する.WaitGroupは、複数のスレッドの同期を実現する
  • package main
    
    import (
    	"fmt"
    	"sync"
    )
    
    func main() {
    	//  waitgroup
    	var wg sync.WaitGroup
    
    	//  10 
    	for i:=0; i<10; i+=1 {
    		//  , 1
    		wg.Add(1)
    
    		idx := i
    		go func(index int) {
    			fmt.Printf("[%d]Hello my friend!
    "
    , index) // wg.Done() }(idx) } // Wait , wg.Wait() }
  • channelによる同期通信
  • を実現する.
    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	//  
    	done := make(chan int)
    
    	go func() {
    		fmt.Println("Hello my friend!")
    		//  
    		done  1
    	}()
    
    	//  
    	done
    }