[勉強ノート] go 並列処理

goの並列処理について

goでの並列処理について勉強した。まず参考書を読んでいると「アトミック性」という初めて聞いた言葉が出てきた。それとコンテキストについて今までふんわりと使っていたので言葉の意味をおさらい。他にも知らない言葉がいっぱいあった。

よくオライリーの本を参考にするので、それを読みながらノートをとっていく。

アトミック性

アトミックとは、原子という意味の「アトム」に由来するソフトウェア用語です。ある操作がアトミックであるといえば、その操作は分かつことができないという意味になります。操作の不可分性をうまく言い表している用語だと思います。

組み込みプログラマーは誰もが、この用語を使うかどうかはともかく、心のどこかでアトミック性というものを意識しておく必要があります。割り込みという名の悪魔が、あなたを混乱に陥れるチャンスを常に狙っているからです。

http://kumikomiya.com/what-does-it-mean-to-be-atomic/

コンテキスト

コンテキストとは、文脈、前後関係、事情、背景、状況などの意味を持つ英単語。ITの分野では、利用者の意図や状況、環境などの総体を表したり、同じ処理や記述でも状況に応じて動作などが異なる場合に、その選択基準となる判断材料や条件などを指す場合が多い。

http://e-words.jp/w/%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88.html

要は

i++

みたいな処理はコンテキストによってアトミックだったりアトミックではなくなったりする。iを他のゴルーチンに公開しないみたいな。そして、アトミックがわかれば、それを複数の平行のコンテキストで安全に扱えることができるということ。

「ここの処理は関数化するか!」見たいのをしっかり考えようねってことかなと。

クリティカルセクション

package main

import(
    "fmt"
)

func main() {
    var data int

    go func() {
        data++
    }()

    if data == 0 {
        fmt.Println("the value is 0.")
    } else {
        fmt.Printf("the vlaue is %v.\n", data)
    }
}

 

上記のようなコードだと

  • データをインクリメントしているゴルーチン
  • if文の条件
  • fmt.Printf

の箇所は排他的なアクセスが必要になるため、クリティカルセクションという。

ここからは意識するべきこととそのおさらい。専門学校の時国家試験で出て以来意識したことはなかった。

デッドロック

並列な処理がお互いを待って進まないこと。

ライブロック

平行プロセス同士がお互いを邪魔して無限ループしているような状態。

リソース枯渇

平行プロセスが処理をするためのリソースを取得できない状態。

上記の項目を意識して勉強していく必要があり、goのプリミティブをつけって安全に記述していくようにする必要がある。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です