多线程之线程安全
1.线程通信
多线程任务中,数据访问冲突的问题。
数据冲突的出现:
因此我们需要线程锁来解决数据冲突!!!
2.线程锁
多线程访问数据,会出现数据冲突的问题,应该怎么解决?
类似生活中,我们可以针对正在访问的数据进行锁定,某一个时刻只能让当前线程访问数据,直到当前线程开锁(释放锁),下一个线程获取锁(进门),下一个线程才能访问数据。
案例:
"""
多线程数据访问问题
"""
import threading
num = 0
def test():
"""测试函数"""
global num
for i in range(1, 1000001):
# 上锁:锁定
lock.acquire()
num += 1
# 开锁
lock.release()
print(f"{threading.current_thread().getName()}当前线程执行完成,num: {num}")
# 创建一个互斥锁{多个线程之间互斥}对象
lock = threading.Lock()
if __name__ == "__main__":
# 创建两个线程,完成计数任务
t1 = threading.Thread(target=test)
t2 = threading.Thread(target=test)
t1.start()
t2.start()
'''
0---10
t1: 1 2 3 11 12 16 : 16
t2: 4 5 6 7 8 9 10 13 14 15 17 18 19 20 : 20
'''
线程锁对于多线程访问数据时,对共享数据的保护非常有用,但是一定要注意死锁的问题
多个线程互相等待对方释放锁,最终导致程序挂死[持续等待…]