在GO中,开启15个线程,每个线程把全局变量遍历增加100000次,因此预测结果是 15*100000=1500000.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
var sum int var cccc int var m * sync.Mutex func Count1(i int , ch chan int ) { for j : = 0 ; j < 100000 ; j + + { cccc = cccc + 1 } ch < - cccc } func main() { m = new(sync.Mutex) ch : = make(chan int , 15 ) for i : = 0 ; i < 15 ; i + + { go Count1(i, ch) } for i : = 0 ; i < 15 ; i + + { select { case msg : = < - ch: fmt.Println(msg) } } } |
但是最终的结果,406527
说明需要加锁。
1
2
3
4
5
6
7
8
|
func Count1(i int , ch chan int ) { m.Lock() for j : = 0 ; j < 100000 ; j + + { cccc = cccc + 1 } ch < - cccc m.Unlock() } |
最终输出:1500000
python中:同样方式实现,也不行。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
count = 0 def sumCount(temp): global count for i in range (temp): count = count + 1 li = [] for i in range ( 15 ): th = threading.Thread(target = sumCount, args = ( 1000000 ,)) th.start() li.append(th) for i in li: i.join() print (count) |
输出结果:3004737
说明也需要加锁:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
mutex = threading.Lock() count = 0 def sumCount(temp): global count mutex.acquire() for i in range (temp): count = count + 1 mutex.release() li = [] for i in range ( 15 ): th = threading.Thread(target = sumCount, args = ( 1000000 ,)) th.start() li.append(th) for i in li: i.join() print (count) |
输出1500000
OK,加锁的小列子。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
原文链接:https://my.oschina.net/u/248241/blog/862684