Windows11にしたくないなぁ
並行処理と並列処理をちょっと勘違いしていたかもしれない。
まだ整理がついてないからうまく書けない気はするが・・・
並行処理 vs 並列処理の様に考えられるものではない。
何かを実装する時に、並行処理か並列処理かどっちを採用するか見比べるものでもない。
並行処理を、実際に処理する場合に、並列処理で処理される場合がある。
恐らく、並行処理と並列処理の"処理"が同じものを指してない。
ちょっと微妙で性質の違う例えだけど、ご飯(食事)としてご飯(白米)を食べるみたいな。
並行処理のコードを書いて、それがマルチコアで並列処理されるかもしれないし、シングルスレッドでスイッチしながら処理されるかもしれない。
並行処理であるから並列処理ではない、とはならない。
GolangのGoroutineは、並行処理を実装する仕組みだけど、そのGoroutine達が並列処理されるかもしれない。というかマルチコアなら基本される。
大体1年前に並行する複数のGoroutineで1個のmapを触ると、書き込みが重なるwrite対writeは勿論、読込中に書き込みが重なるwrite対readであっても競合(fatal error: concurrent map read and map write)が発生する事を知った。
1年たって、別にmapじゃなくてintやstringの変数を、並行する複数のGoroutineから触っても競合が発生する事を知った。
並行処理をしてる方のコードをメインで触ってないのもあるけど、1年越し・・・
mapの場合はpanicになるのに対し、こっちはpanicにはならず、ただ競合した結果不正なデータになってしまう可能性があるらしい。
package main
import (
"fmt"
"sync"
)
func main() {
data := 0
var wg sync.WaitGroup
for i := 0; i < 2; i++ {
wg.Add(1)
go func() {
defer wg.Done()
data++
}()
}
wg.Wait()
fmt.Printf("Final Data: %d\n", data)
}
// Playgroundで実行しても競合は分からないが、手元で-raceフラグ付きで実行すると競合すると分かる。
//
// go run -race readwrite/main.go
// ==================
// WARNING: DATA RACE
// Read at 0x00c000014158 by goroutine 7:
// main.main.func1()
// /path/to/readwrite/main.go:16 +0x84
//
// Previous write at 0x00c000014158 by goroutine 8:
// main.main.func1()
// /path/to/readwrite/main.go:16 +0x96
//
// Goroutine 7 (running) created at:
// main.main()
// /path/to/readwrite/main.go:14 +0x78
//
// Goroutine 8 (finished) created at:
// main.main()
// /path/to/readwrite/main.go:14 +0x78
// ==================
// Final Data: 2
// Found 1 data race(s)
// exit status 66
https://go.dev/play/p/XkbLbvNEmU2今年の1月にオライリーの電子書籍が割安なの終わるってんでいくつか買ったけど、これも買えばよかったなー。並行処理がもうわかなさすぎる。
O'Reilly Japan \- Go言語による並行処理
悲報 immersed v13\.00以降 ダミープラグ 物理ディスプレィのサポートを廃止 \- Gon 中国輸入 ネットビジネスとeBay輸出奮闘記
サブモニターを抜いたら、サブモニターに表示してたウィンドウが全部メインモニターに来てごっちゃになるし、Immersedを使う時だけ抜くとか現実的じゃないなぁ。なんでそんな制限を加えたいのかも良く分からないけど、このままだと自分には使えないサービスになりそう。
余ってしまってるかぼす果汁、ポン酢の代わりにめんつゆと混ぜてサラダにかけて消費を試みてるが、酸っぱさ的にほんの少ししか使わないので、全然減ってない。使い切るの無理な気がする・・