互斥锁LOCK()与RLOCK()

资源总是有限的,程序运行如果对同一个对象进行操作,则有可能造成资源竞争,也可能导致读写混乱,此时需要引入锁。

锁提供如下方法: 
1.Lock.acquire([blocking])    # 上锁
2.Lock.release()      # 解锁
3.threading.Lock()      # 加载线程的锁对象,是一个基本的锁对象,一次只能一个锁定,其余锁请求,需等待锁释放后才能获取

4.threading.RLock() 多重锁,在同一线程中可用被多次acquire。如果使用RLock,那么acquire和release必须成对出现, 
调用了n次acquire锁请求,则必须调用n次的release才能在线程中释放锁对象

例如: 
无锁:

 1 import threading
 2 import time
 3
 4 g_num = 0
 5
 6
 7 def work1(num):
 8     for i in range(num):
 9         global g_num
10         g_num += 1
11     print("___in work1,g_num is %d" % g_num)
12
13
14 def work2(num):
15     for i in range(num):
16         global g_num
17         g_num += 1
18     print("___in work2,g_num is %d" % g_num)
19
20
21 t1 = threading.Thread(target=work1, args=(1000000,))
22 t2 = threading.Thread(target=work2, args=(1000000,))
23 t1.start()
24 t2.start()
25
26 time.sleep(3)
27
28 print("___g_num is %d" % g_num)

  运行结果:

1 ___in work1,g_num is 1194618
2 ___in work2,g_num is 1334899
3 ___g_num is 1334899

引入锁:

 1 import threading
 2 import time
 3
 4 # 定义一个全局变量
 5 g_num = 0
 6
 7
 8 def work1(num):
 9     global g_num
10     for i in range(num):
11         # 互斥锁上锁和解锁间包含的代码越少越好
12         mutex.acquire()
13         g_num += 1
14         mutex.release()
15     print("___in work1,g_num is %d" % g_num)
16
17
18 def work2(num):
19     global g_num
20     for i in range(num):
21         mutex.acquire()
22         g_num += 1
23         mutex.release()
24     print("___in work2,g_num is %d" % g_num)
25
26
27 # 创建一个互斥锁,默认是没有上锁的
28 mutex = threading.Lock()
29
30
31 t1 = threading.Thread(target=work1, args=(1000000,))
32 t2 = threading.Thread(target=work2, args=(1000000,))
33 t1.start()
34 t2.start()
35
36 time.sleep(3)
37
38 print("___g_num is %d" % g_num)

  运行结果:

1 ___in work1,g_num is 1945701
2 ___in work2,g_num is 2000000
3 ___g_num is 2000000

其中: 
  lock=threading.Lock()加载锁的方法也可以换成lock=threading.RLock()

  如果将上面的work1改为:

1 mutex.acquire()
2 global g_num
3 mutexk.acquire()
4     for i in range(num):
5         g_num += 1
6         mutex.release()
7         print("___in work1,g_num is %d" % g_num)
8         mutexk.release()

  那么: 
  lock=threading.Lock() 加载的锁,则一直处于等待中,锁等待 
  而lock=threading.RLock() 运行正常

lock()避免死锁的解决方法:

  1.程序设置时要尽量避免(银行家算法)

  2.添加超时时间

原文地址:https://www.cnblogs.com/zuzhuangmengxiang/p/12663908.html

时间: 2024-11-02 12:40:46

互斥锁LOCK()与RLOCK()的相关文章

python线程互斥锁Lock(29)

在前一篇文章 python线程创建和传参 中我们介绍了关于python线程的一些简单函数使用和线程的参数传递,使用多线程可以同时执行多个任务,提高开发效率,但是在实际开发中往往我们会碰到线程同步问题,假如有这样一个场景:对全局变量累加1000000次,为了提高效率,我们可以使用多线程完成,示例代码如下: # !usr/bin/env python # -*- coding:utf-8 _*- """ @Author:何以解忧 @Blog(个人博客地址): shuopython

linux驱动开发(十一)linux内核信号量、互斥锁、自旋锁

参考: http://www.360doc.com/content/12/0723/00/9298584_225900606.shtml http://www.cnblogs.com/biyeymyhjob/archive/2012/07/21/2602015.html http://blog.chinaunix.net/uid-25100840-id-3147086.html http://blog.csdn.net/u012719256/article/details/52670098 --

Python进阶(3)_进程与线程中的lock(互斥锁、递归锁、信号量)

1.同步锁 (Lock) 当各个线程需要访问一个公共资源时,会出现数据紊乱 例如: 1 import threading,time 2 def sub(): 3 global num #对全局变量进行操作 4 5 temp=num 6 time.sleep(0.001) #模拟线程执行中出现I/o延迟等 7 num=temp-1 #所有线程对全局变量进行减一 8 9 time.sleep(1) 10 11 num=100 12 l=[] 13 14 for i in range(100): 15

Java 线程锁机制 -Synchronized Lock 互斥锁 读写锁

synchronized 是互斥锁: lock 更广泛,包含了读写锁 读写锁特点: 1)多个读者可以同时进行读2)写者必须互斥(只允许一个写者写,也不能读者写者同时进行)3)写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者) 互斥锁特点: 一次只能一个线程拥有互斥锁,其他线程只有等待 所谓互斥锁, 指的是一次最多只能有一个线程持有的锁. 在jdk1.5之前, 我们通常使用synchronized机制控制多个线程对共享资源的访问. 而现在, Lock提供了比synchronize

synchronized与lock 对象锁、互斥锁、共享锁以及公平锁和非公平锁

synchronized与lock  都是用来实现线程同步的锁,synchronized对象锁,lock是一个接口,她的实现有reentrantlock互斥锁以及ReentrantReadWriteLock共享锁. 这里说明一下ReentrantReadWriteLock共享锁,所谓共享就是该锁提供读读锁共享,即可以多个线程共享一个读取锁,但是读写锁以及读读锁是互斥的. 看到网上有好多介绍介绍锁的种类的,有对象锁.互斥锁.共享锁以及公平锁和非公平锁,但是说明都不够详细了然,在这里用直白的说法记录

Lock()与RLock()锁

资源总是有限的,程序运行如果对同一个对象进行操作,则有可能造成资源的争用,甚至导致死锁 也可能导致读写混乱 锁提供如下方法: 1.Lock.acquire([blocking]) 2.Lock.release() 3.threading.Lock() 加载线程的锁对象,是一个基本的锁对象,一次只能一个锁定,其余锁请求,需等待锁释放后才能获取 4.threading.RLock() 多重锁,在同一线程中可用被多次acquire.如果使用RLock,那么acquire和release必须成对出现,

C# lock 语法糖实现原理--《.NET Core 底层入门》之自旋锁,互斥锁,混合锁,读写锁

原文:C# lock 语法糖实现原理--<.NET Core 底层入门>之自旋锁,互斥锁,混合锁,读写锁 在多线程环境中,多个线程可能会同时访问同一个资源,为了避免访问发生冲突,可以根据访问的复杂程度采取不同的措施 原子操作适用于简单的单个操作,无锁算法适用于相对简单的一连串操作,而线程锁适用于复杂的一连串操作 原子操作 修改状态要么成功且状态改变,要么失败且状态不变,并且外部只能观察到修改前或者修改后的状态,修改中途的状态不能被观察到 .NET 中,System.Threading.Inte

python多线程编程(2): 使用互斥锁同步线程

上一节的例子中,每个线程互相独立,相互之间没有任何关系.现在假设这样一个例子:有一个全局的计数num,每个线程获取这个全局的计数,根据num进行一些处理,然后将num加1.很容易写出这样的代码: # encoding: UTF-8import threadingimport time class MyThread(threading.Thread): def run(self): global num time.sleep(1) num = num+1 msg = self.name+' set

11.python并发入门(part3 多线程与互斥锁)

一.锁的概念. 锁,通常被用来实现共享数据的访问,为每一个共享的数据,创建一个Lock对象(一把锁),当需要访问这个共享的资源时,可以调用acquire方法来获取一个锁的对象,当共享资源访问结束后,在调用release方法去解锁. 二.python中的互斥锁. 在介绍互斥锁之前,先来一起看一个例子.(每个线程对num实现一次-1的操作) import threading import  time num = 200  #每个线程都共享这个变量. tread_list = [] def count