码迷,mamicode.com
首页 > 编程语言 > 详细

线程锁

时间:2018-11-09 21:38:48      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:src   线程锁   code   其他   isp   分享   执行函数   imp   star   

线程的互斥锁

from threading import Thread,Lock
# 创建一个互斥锁
mutex = Lock()

def task1():
    # 锁定
    mutex.acquire()
    for i in range(100):
        print("===================")
    # 打开
    mutex.release()
def task2():
    mutex.acquire()
    for i in range(100):
        print("!!!!!!!!!!!!!!!!!!")
    mutex.release()

def task3():
    mutex.acquire()
    for i in range(100):
        print("********************")
    mutex.release()

t1 = Thread(target=task1)
t2 = Thread(target=task2)
t3 = Thread(target=task3)

t1.start()
t2.start()
t3.start()

死锁

技术分享图片
from threading import Thread,Lock
import time,random

mutex1 = Lock()
mutex2 = Lock()
def fun1():
    mutex1.acquire()
    print("抢到了锁1")
    time.sleep(1)
    mutex2.acquire()
    print("抢到了锁2")

    mutex2.release()
    print("释放了锁2")

    mutex1.release()
    print("释放了锁1")


def fun2():

    mutex2.acquire()
    print("抢到了锁2")

    time.sleep(1)

    mutex1.acquire()
    print("抢到了锁1")



    mutex1.release()
    print("释放了锁2")

    mutex2.release()
    print("释放了锁1")

# def fun3():
#     fun1()
#     fun2(

t1 = Thread(target=fun1)
t1.start()
t2 = Thread(target=fun2)
t2.start()
View Code

当两个线程正在争抢对方已经加锁的,所以只能等待对方释放锁

死锁发生的条件 有多个线程 多个锁 如果只有一个锁 无论是LOCK RLOK 卡不死(前提是逻辑上没有错误)

RLock 就算你的代码逻辑不对 同一个线程多次对一个锁执行acquire 也不会卡死

RLock

import time
lock = RLock()
# 对于同一个线程而言 可以多次acquire  其他线程会被阻塞
def task():
    lock.acquire()
    for i in range(5):
        time.sleep(1)
        print(current_thread())
    lock.release()

Thread(target=task).start()
Thread(target=task).start()

信号量

Semaphore 相当于限制执行代码的线程数量

默认为不限制

from threading import Thread,Semaphore,current_thread,active_count
import time
sm = Semaphore(3)#

def task():
    sm.acquire()#不限制线程的生成,但是限制当前执行函数的线程
    for i in range(5):
        time.sleep(0.1)
        print(current_thread())
    sm.release()

def task1():
    for i in range(5):
        time.sleep(0.1)
        print(current_thread())


for i in range(5):
    t = Thread(target=task)
    t1 = Thread(target=task1)
    t.start()
    t1.start()
print(active_count())

 

线程锁

标签:src   线程锁   code   其他   isp   分享   执行函数   imp   star   

原文地址:https://www.cnblogs.com/msj513/p/9937226.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!