python中的互斥锁

来源:互联网 发布:内存 知乎 编辑:程序博客网 时间:2024/06/06 03:23

如果没有控制多个线程对同一资源的访问,对数据造成破坏,使得线程运行的结果不可预期。这种现象称为“线程不安全”。

 

线程同步解决问题:

  1. 系统调用t1,然后获取到num的值为0,此时上一把锁,即不允许其他现在操作num
  2. 对num的值进行+1
  3. 解锁,此时num的值为1,其他的线程就可以使用num了,而且是num的值不是0而是1
  4. 同理其他线程在对num进行修改时,都要先上锁,处理完后再解锁,在上锁的整个过程中不允许其他线程访问,就保证了数据的正确性

 

from threading import Thread, Lock

 

num =0  #资源竞争问题

mutex= Lock()  #创建一个互斥锁

def fun1():

    global num

    for i in range(1000000):

        mutex.acquire()

        # acquire首先判断锁的当前状态,如果锁处于上锁状态,则默认处于阻塞等待,

        #等待直到锁变成未上锁状态的时候,才能继续向下运行

        #如果一旦发现锁处于未上锁状态,则将锁设置为上锁

        num += 1

        mutex.release() # 释放锁,表示将锁设置为打开状态

 

def fun2():

    global num

    for i in range(1000000):

        mutex.acquire()

        num += 1

        mutex.release()  # 释放锁,表示将锁设置为打开状态

 

 

t1 =Thread(target=fun1)  #创建一个线程对象

t2 =Thread(target=fun2)  #创建一个线程对象

 

t1.start()  #开启线程的执行

t2.start()

 

t1.join()  #回收线程资源

t2.join()

 

print(num)

 

原创粉丝点击