0%

Race Condition

前言

同步競爭(Race Condition)是指說某個資料因為多個行程而導致最終資料不正確的狀況

這其實滿淺顯易懂的,但懂歸懂有時候還是會忽略到一些狀況。

介紹

我們先來看下面的程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package main

import (
"fmt"
"time"
)

func foo(a *int) {
*a = *a + 3
fmt.Println("a = ", *a)
if *a%3 == 0 {
fmt.Println("Hello foo")
}
}

func boo(b *int) {
*b = *b + 5
fmt.Println("b = ", *b)
if *b%3 == 0 {
fmt.Println("Hello boo")
}
}

func main() {
a := 0
go func() {
for i := 0; i < 3; i++ {
foo(&a)
}
}()

go func() {
for i := 0; i < 3; i++ {
boo(&a)
}
}()

time.Sleep(1 * time.Second) // 讓主執行緒休眠1秒
}

在這段 Code 中,我期待每次用 foo()boo() 都會跑裡面的條件式

但實際上發生什麼事我們來看看

1
2
3
4
5
6
7
8
9
10
b =  8
b = 13
b = 18
Hello boo
a = 3
Hello foo
a = 21
Hello foo
a = 24
Hello foo

發現了嗎,不只是條件式沒有跑出來,連同 b 和 a 的順序不同,這到底是為什麼

為什麼會發生

因為在這段 Code 中,我們會看到 foo()boo() 會是併發的狀況,變成是這兩者不再是照順序執行的且 function 中傳遞的還是指標,所以在這個情況下,就會同時修改同一個記憶體位址的值