# coding:utf8
import time
import threading
N = 0
def change_it(n):
global N
N = N + n
def run_thread(n):
for i in range(100000):
change_it(n)
t1 = threading.Thread(target=run_thread, args=(1,))
t2 = threading.Thread(target=run_thread, args=(1,))
t1.start()
t2.start()
t1.join()
t2.join()
print(balance)
package main
import (
"fmt"
"sync"
)
// N 是内存里的一个对象
var (
N = 0
mutex sync.Mutex // 1
waitgroup sync.WaitGroup
)
func counter(number *int) {
mutex.Lock() // 2
*number++
mutex.Unlock() // 3
waitgroup.Done()
}
func main() {
for i := 0; i < 1000; i++ {
waitgroup.Add(1)
go counter(&N)
}
waitgroup.Wait()
fmt.Println(N)
}
加了三行,注释为数字,结果如下:
运行 10 次
不信?检测 race condition:
检测竞态条件
通过 ✌️
解决竞态条件(Python 代码)
# coding:utf8
import time
import threading
N = 0
mutex = threading.Lock() # 1
def change_it(n):
global N
if mutex.acquire(1): # 2
N = N + n
mutex.release() # 3
def run_thread(n):
for i in range(100000):
change_it(n)
t1 = threading.Thread(target=run_thread, args=(1,))
t2 = threading.Thread(target=run_thread, args=(1,))
t1.start()
t2.start()
t1.join()
t2.join()
print(N)