python关于多线程使用全局变量的问题

python关于多线程使用全局变量的问题

在多线程中,如果多线程同时对一个全局变量进行操作时,就有可能出现异常,比如下面的程序:

# -*- coding:UTF-8 -*-
import threading
import time

#定义一个全局变量
g_num = 0

def test1(num):
    global g_num
    for i in range(num):
        g_num += 1
    print(g_num)

def test2(num):
    global g_num
    for i in range(num):
        g_num += 1
    print(g_num)

def main():
    t1 = threading.Thread(target=test1,args=(10000000,))
    t2 = threading.Thread(target=test2,args=(10000000,))
    t1.start()
    t2.start()

    time.sleep(5)
    print('结束:',g_num)

if __name__ == '__main__':
    main()

运行后得到的结果本应是20000000,可是结果真是这样吗?运行后得到的结果是:
在这里插入图片描述
这是因为一个程序在未运行完全时就被停止而执行另一个程序了,从而导致这样的结果。

那么怎么解决这个问题呢?这里就用到了多线程的互斥锁。具体参见下面的程序:

# -*- coding:UTF-8 -*-
import threading
import time

#定义一个全局变量
g_num = 0

def test1(num):
    global g_num
    #上锁
    mutex.acquire()
    for i in range(num):
        g_num += 1
    #解锁
    mutex.release()
    print(g_num)

def test2(num):
    global g_num
    # 上锁
    mutex.acquire()
    for i in range(num):
        g_num += 1
    mutex.release()
    print(g_num)

def main():
    t1 = threading.Thread(target=test1,args=(10000000,))
    t2 = threading.Thread(target=test2,args=(10000000,))
    t1.start()
    t2.start()

    time.sleep(3)
    print('结束:',g_num)

if __name__ == '__main__':
    mutex = threading.Lock()
    main()

此时我们就可以得到我们想要的答案了:
在这里插入图片描述

posted @ 2022-04-24 15:33  南瓜头pumpkin  阅读(16)  评论(0)    收藏  举报