Python考试题--第69道题目--程序锁是什么,怎样使用线程锁--2022年04月24日

原创
小哥 3年前 (2022-10-29) 阅读数 5 #大杂烩

目录

1.线程锁的定义:

1线程锁的核心目的是:

2,为什么需要线程锁:

3如何使用线程锁:

2.示例代码演示:

1使用线程锁:一个线程完成后,继续下一个线程。

2、 如果没有线程锁,线程执行会令人困惑:


1.线程锁的定义:

1线程锁的核心目的是:

为了确保数据的一致性,线程锁中的资源(变量)被锁定,以避免偷偷篡改其他线程。以达到我们预期的效果。也就是说,异步变量同步。

2,为什么需要线程锁:

由于多个线程在同时完成特定操作的过程中可能会中断,因此在执行其他操作时可能会产生脏数据。

例如,一个线程读取一个变量。n,[初始值为0],然后n++,最终输出n。当访问n++在被中断之后,还有另一个线程在做同样的工作。在这个时候n被加了2次,所以n最后等于2,而不是1。

3如何使用线程锁:

1,模式一:acquire()和release()都是成对的。经常会出现死锁。release不执行死刑。

import threading
#创建锁定对象
lock = threading.Lock()
#获取锁
lock.acquire()
#释放锁
lock.release()

2,模式二:with它可以自动获取和释放锁,这可以防止我们忘记释放锁而导致死锁。

import  threading
lock = threading.Lock()
with lock:
    #业务代码
    pass

2.示例代码演示:

1使用线程锁:一个线程完成后,继续下一个线程。

import random
from time import sleep, ctime
from threading import Thread, Lock, currentThread
from atexit import register

lock = Lock()
print(type(lock))

def fun():
    lock.acquire() # 加锁
    for i in range(4):
        print("Thread Name","=",currentThread().name,"i","=",i)
        sleep(random.randint(1,5))
    lock.release() # 解锁
def main():
    for i in range(3):
        Thread(target=fun).start()
@register
def exit():
    print("线程执行已完成:", ctime())
main()

执行结果如下:

2、 如果没有线程锁,线程执行会令人困惑:

import random
from time import sleep, ctime
from threading import Thread, Lock, currentThread
from atexit import register

lock = Lock()
print(type(lock))

def fun():
    # lock.acquire() # 加锁
    for i in range(4):
        print("Thread Name","=",currentThread().name,"i","=",i)
        sleep(random.randint(1,5))
    # lock.release() # 解锁
def main():
    for i in range(3):
        Thread(target=fun).start()
@register
def exit():
    print("线程执行已完成:", ctime())
main()

执行结果:

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除