在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