目录

1.多线程共享变量例子:

2.线程锁例子

1.多线程共享变量例子:

        该代码的意思是启动了两个线程,在第一个线程中,改变了两次全局变量a的值,在第二个线程中看看能否知道a的值被改变了。

from threading import Thread
import time


a = 0
def func():
    global a
    a = 10
    print("线程1:",a)
    time.sleep(5)
    a = 11

def func2():
    print("线程2:", a)
    time.sleep(6)
    print("线程2:", a)

t1 = Thread(target=func)
t2 = Thread(target=func2)

t1.start()
t2.start()

 运行结果:

         根据运行结果可知,当一个线程改变了全局变量的值,其它线程读取这个变量也会是改变后的值。

        但随之而来的问题是,当一个线程正在对变量a进行计算时,其它线程此时也改变了a的值,这就会导致第一个线程的计算结果发生错误。为了避免这种情况,可以使用线程锁。

        线程锁的意义是同一个时刻,只能有一个线程获得这把锁,然后对数据进行操作,其他的线程只能等待。这样,就可以避免多个线程同时修改一份数据。

2.线程锁例子

我们通过两段代码来了解线程锁的意义 

下面代码加了线程锁:

from threading import Thread,Lock
import time

m_lock = Lock()

a = 0
def func():
    global a
    m_lock.acquire()  # 加锁
    for i in range(1000000):
        a = a + 1
    print("线程1:", a)  # 释放锁
    m_lock.release()

def func2():
    global a
    m_lock.acquire()
    a = a + 8
    m_lock.release()
    print("线程2:", a)

t1 = Thread(target=func)
t2 = Thread(target=func2)

t1.start()
t2.start()

 运行结果:

如果不加锁:

from threading import Thread,Lock
import time

m_lock = Lock()

a = 0
def func():
    global a
    for i in range(1000000):
        a = a + 1
    print("线程1:", a)  # 释放锁

def func2():
    global a
    a = a + 8
    print("线程2:", a)

t1 = Thread(target=func)
t2 = Thread(target=func2)

t1.start()
t2.start()

 运行结果:

 通过对比两段代码的运行结果可知,加线程锁是十分有必要的。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐