在使用多线程处理程序的过程中,如何多个线程同时操作一个对象,很容易造成线程不安全的问题,严重影响程序结果。因此会使用线程锁,线程锁就向我们正常生活中的锁一样,可以保护我们想要保护对象的安全,而且还可以同时使用多个锁锁住一个资源。
1、什么是线程锁?
同一时刻只允许一个线程操作该数据,可以保证数据安全。
线程锁用于锁定资源,可以同时使用多个锁,当需要独占某一资源时,任何一个锁都可以锁这个资源。
2、线程锁目的
将一段代码锁住,一旦获得锁权限,除非释放线程锁,否则其他代码都无法获得锁权限。
3、为什么要使用线程锁?
多线程同时完成特定的操作时,由于并不是原子操作,所以在完成操作的过程中会被打断去做其他的工作,可能会产生脏数据
4、创建锁:
lock=threading.Lock() cond=threading.Condition(lock=lock)
5、锁的方法:
cond.acquire():获得锁 cond.wait()等待通知 cond.notify()通知正在等待的锁 cond.notify_all()通知所有正在等待的锁 cond.release()释放锁
5、使用线程锁
""" 多线程数据访问问题 """ importthreading num=0 deftest(): """测试函数""" globalnum foriinrange(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:123111216:16 t2:4567891013141517181920:20 '''
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论(0)