同時概要
並行性:通常は1を意味する以上のプロセスが同時に起こるプロセス
1を、競争の条件:二つ以上の操作が正しい順序で実行する必要があり、プログラムの順序を保証しない場合
var data int
go func(){
data++
}()
if data == 0{
fmt.Printf("The data:%d\n",data)
}
このコードは3例であってもよいです
- 印刷されません。
- データを印刷:0
- データを印刷:1の
競争が思考の連続的な方法で浮上している主な理由は、避けるべきである不確実性、ありますように、競合状態は、並行性の最も困難なタイプがバグ見つかったものである
2、原子セックス
の動作環境に不可欠または非中断されることを意図原子または原子自然、として識別した場合は
、コンテキスト:他のコンテキストでは、それはアトミックではありませんしながら、この文脈では何かが、アトミックでありますの。例えば、アプリケーションのコンテキストで動作は、オペレーティングシステムのコンテキストではなくアトミックに、アトミックです。すなわち、アトミックオペレーションは現在定義の範囲に依存して変化し得る
第一の定義のコンテキストまたは範囲、操作がアトミックであるかどうかを考慮し、続いて:原子設計
不可分と無停電:
私は、プログラム内で動作++を分けることができる
-取得私値
- iの値を増加させる
-私はに格納された値
の各ステップは、アトミックであるが、組合せがない場合があり、文脈に応じて
data := 0
w := sync.WaitGroup{}
for i := 0; i < 100000; i++{
w.Add(1)
go func() {
data++
w.Done()
}()
}
w.Wait()
fmt.Println("data:",data)
印刷データの値が不確定であります
3、メモリアクセスの同期
データの競合の例:
var data int
go func(){
data++
}()
if data == 0{
fmt.Printf("The data:%d\n",data)
} else{
fmt.Printf("the data:%d\n",data)
}
常に正しい競合しないデータ出力の場合には、プログラムの出力があります
:3つの重要な地域(共有リソースへの一部の排他アクセス)の手順
- データ変数でゴルーチンの増加を
確認するかどうかのデータ== 0の場合-設立
- fmt.Printfが取得され、出力データ値は
、一般的にメモリアクセスを同期するためにロックを使用しますが、ロック機構は、自動的にデータや競争上の問題の論理的な正しさを解決するだけでなく、パフォーマンスの問題が発生します